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

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

例程:
该示例显示了一个输入线程,该线程从控制台(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. 死磕 java线程系列之线程的生命周期

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的. 常见的错 ...

  2. 关于HACLON程序导出C#程序,运行报错解决方法

    摘要:一些环境配置异常的解决方法. 一,打不开相机: 1.打开系统高级设置--环境变量中是否有 HALCONROOT+安装目录名,若无进行添加. 2.关闭计算机其他连接相机的软件,例如海康的MVS,H ...

  3. Go-内置time包

    一.导入包 import "time" 二.转换成Time对象 获取当前时间:time. Now () 自定义时间:time. Date(year int, month Month ...

  4. 转换流读写操作 java.io.OutputStreamWriter ,java.io.InputStreamReader

    package seday07; import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStr ...

  5. Java生鲜电商平台-商城系统库存问题分析以及产品设计对逻辑/物理删除思考

    Java生鲜电商平台-商城系统库存问题分析以及产品设计对逻辑/物理删除思考 说明:在生鲜电商的库存设计,是后台的重点,也是难点,关乎商品是否存在超卖.商品的库存增加方式倒不难,直接在后台添加即可,而扣 ...

  6. python 使用tesseract进行图片识别

    from PIL import Image import pytesseract text = pytesseract.image_to_string(Image.open(r'E:\guo\2432 ...

  7. GO基础之切片

    一.什么是切片 Go语言切片是对数组的抽象. Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"): 与数组相比切 ...

  8. canvas实现七巧板图案和粒子时钟

      canvas实现七巧板 <canvas id="canvas" width="800" height="800"></ ...

  9. 微信小程序出现 text 设置行高 line-height 无效的问题

    前言: 我在写程序过程中遇到过给text加line-height不生效的问题,但是也有生效的情况,如果不生效了就按下面的解决方法处理吧. 解决办法: 在text的外层嵌套一层view,然后给view设 ...

  10. jQuery实现简单的tab切换

    html: <section>   <nav id="nav">     <a class="on">tab1</a& ...