说明
当我们有多个线程以不同的速度运行并且我们想要以特定的顺序从一个线程向另一个线程发送信息时,消息队列可能会有用。

这个想法是,发送线程将消息推送到队列中,而接收线程将消息按自己的步调弹出。 只要发送线程平均发送的消息不超过接收线程可以处理的数量,此系统就可以工作。 因为队列充当缓冲区,所以消息可能会突发发送和弹出,换句话说:只要一段时间内的平均发送速度低于接收者的容量,流量就会达到峰值。

例程
该示例显示了一个输入线程,该线程从控制台(cin)读取数据并将其推送到消息队列中。 另一个线程(接收方)检查队列大小,如果该大小不为零,则将消息弹出队列,并像处理该消息一样工作。

打开Qt Creator,新建控制台应用程序,选择MingW构建组件

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
 # ifndef MSGQUEUE_H
 # define MSGQUEUE_H
 
 # include < iostream >
 # include < cstdlib >
 # include < unistd.h > // usleep
 # include < fcntl.h > // threads
 # include < pthread.h >
 # include < string > // messages
 # include < queue > // the message queue
 
 using namespace std;
 
 pthread_mutex_t msgmutex = PTHREAD_MUTEX_INITIALIZER;
 
 queue < string > msgq;
 
 void *msgreceiver(void *arg)
 {
     long qsize;
     string nextmsg;
     while (true)
     {
         if (msgq.empty())
         {
             usleep(); // sleep 0.01 sec before trying again
             continue;
         }
 
         // we end up here because there was something in the msg queue
         pthread_mutex_lock( & msgmutex);
         qsize = msgq.size();
         )
             cout << "Queue size: " << qsize << endl;
         nextmsg = msgq.front(); // get next message in queue
         msgq.pop(); // remove it from the queue
         pthread_mutex_unlock( & msgmutex);
 
         cout << "Processing value " << nextmsg << endl;
         usleep();
     }
     pthread_exit(();
 } // msgreceiver()
 
 void *msgtransmitter(void *arg)
 {
     string nextmsg;
     while (true)
     {
         cin >> nextmsg;
         pthread_mutex_lock( & msgmutex);
         msgq.push(nextmsg); // push message onto the queue
         pthread_mutex_unlock( & msgmutex);
     }
     pthread_exit(();
 } // msgtransmitter()
 
 int test_msgqueue()
 {
     pthread_t thr;
 
     // Create threads
     if (pthread_create( & thr, NULL, msgreceiver, NULL) ||
             pthread_create( & thr, NULL, msgtransmitter, NULL))
     {
         cout << " cannot make thread\n";
         exit();
     }
 
     /*
      * At this point the main thread can perform its actions or end
      */
     cout << "** Main thread ends **\n";
     pthread_exit(();
 
 }
 
 # endif // MSGQUEUE_H

测试截图

C++ message queue 消息队列入门的更多相关文章

  1. RabbitMQ消息队列入门(一)——RabbitMQ消息队列的安装(Windows环境下)

    一.RabbitMQ介绍1.RabbitMQ简介RabbitMQ是一个消息代理:它接受和转发消息.你可以把它想象成一个邮局:当你把你想要发布的邮件放在邮箱中时,你可以确定邮差先生最终将邮件发送给你的收 ...

  2. 微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用

    目录 定义的接口 接口实现 建立队列工厂 写入队列 获取消息 什么是MSMQ Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消 ...

  3. RabbitMQ 消息队列入门

    文档 入门 主要的内容:one two three four five six seven 前言 中间件 消息队列 异步处理,注册完发短信 应用解耦,订单接口调用扣库存接口,失败了怎么办? 流量削峰, ...

  4. RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)

    一.消息队列使用场景或者其好处 消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 在项目启 ...

  5. php消息队列之 think queue消息队列初体验

    使用thinkphp 5的  消息队列 think queue ● php think queue:listen --queue queuename ● php think queue:work -- ...

  6. think queue 消息队列初体验

    使用的是tp5  自带的消息队列 thinkphp top里的 消息队列框架 think-queue 这是thinkphp官方团队开发的一个专门支持队列服务的扩展包 消息队列应用场景: 消息队列适用于 ...

  7. RocketMQ—消息队列入门

    消息队列功能介绍 字面上说的消息队列是数据结构中"先进先出"的一种数据结构,但是如果要求消除单点故障,保证消息传输可靠性,应对大流量的冲击,对消息队列的要求就很高了.现在互联网的& ...

  8. 消息队列入门(三)JMS标准及实现

    >>消息中间件 消息中间件即Message-oriented middleware(MOM),消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集 ...

  9. RabbitMQ 消息队列 入门 第二章(交换类型fanout)

    1.安装完 RabbitMQ 之后,我们可以点击  http://localhost:15672/#/  默认账号:guest  密码: guest  在这上面我们可以查看执行情况.管理连接.管理队列 ...

随机推荐

  1. Oracle 事务ACID的特性

    1.事务对数据库控制操作 事务(Transaction)是用户定义的一个数据库操作序列,是不可分割的一部分的整体.这些操作要么做,要么不做(原子性).事务是对数据库对进行操作的最基本的逻辑单位,他可以 ...

  2. 数字图像处理:图像的灰度变换(Matlab实现)

    (1)线性变换:通过建立灰度映射来调整源图像的灰度. k>1增强图像的对比度:k=1调节图像亮度,通过改变d值达到调节亮度目的:0 i = imread('theatre.jpg');i = i ...

  3. 如何去除小程序button的边框

    小程序button 自带样式,就算用 border:none: background:none ,还是会有一条细的边框 使用:after选择器就可以去除 button::after{ border:n ...

  4. Memcached 基本语法 记录

    set 命令:命令将value数值存储在指定的key中: set key flags exptime bytes [noreply] value key:键值 key-value 结构中的 key,用 ...

  5. CentOS安装docker-compose

    一.compose简介 compose是一个定义和运行多容器的docker应用的工具.compose 通过yaml文件配置应用服务,然后仅需一个命令就可以创建和运行所有配置中的服务. 二.compos ...

  6. 3. java 方法入门

    一.方法定义 1. 定义格式 public static void 方法名称(){ 方法体 } 1. 方法名称:命名和变量一致,小驼峰式 2. 方法体:大括号中可以包含任意条语句 注意事项: 1. 方 ...

  7. RabbitMQ学习笔记(三、生产者与消费者)

    目录: 细说交换器 细说队列 发送消息 消费消息 确认与拒绝 细说交换器: 1.方法: public AMQP.Exchange.DeclareOk exchangeDeclare(String ex ...

  8. windows搭建成代理服务器 CCProxy

    1.软件下载地址 http://www.ccproxy.com/ 2.账号激活 CCProxy无限用户版序列号:JHEHIHCDDAHC注册码:15f7f78febfaee55afeafefff7cb ...

  9. POJ 2386 Lake Counting 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=2386 <挑战程序设计竞赛>习题 题目描述Description Due to recent rains, water has ...

  10. LG1344 「USACO4.4」Pollutant Control 最小割

    问题描述 LG1344 题解 我太菜了,我一开始竟然没有看出这是个最小割裸题... 两个询问. 第一个询问,直接跑最小割就好了. 第二个询问,建图的时候边权建 \(1\) ,代表割掉这条边需要 \(1 ...