Message Queue后文简写成MQ戒消息队列是boost库中用来封装进程间通信的一种实现同一台机器上的进程戒线程可以通过消息队列来进行通迅。消息队列中的消息由优先级、消息长度、消息数据三部分组成。这里需要注意的事MQ叧是简单的将要发送的数据在内存中进行拷贝所以我们在发送复杂结构戒对象时我们需要将其序列化后再发送接收端接收时要反序列化也就是说我们要自己去定义区分一条消息就是自定义网络通迅协议 。在MQ中我们可以使用三模式去发送和接收消息
1. 阻塞在发送消息时若消息队列满了那么发送接口将会阻塞直到队列没有满。
在接收消息时若队列为空那么接收接口也会阻塞直到队列不空。
2.超时用户可以自定义超时时间在超时时间到了那么发送接口或接收接口都会
返回无论队列满或空
3. T ry在队列为空或满时都能立即返回
MQ使用命名的共享内存来实现进程间通信。共享内存换句话来说就是用户可以指定一个名称来创建一块共享内存然后像打一个文件一样去打开这块共享内存同样别的进程也可以根据这个名称来打开这块共享内存这样一个进程向共享内存中写另一个进程就可以从共享内存中读。这里两个进程的读写就涉及到同步问题。另外在创建一个MQ时我们需要指定MQ的最大消息数量以及消息的最大size。
//Create a message_queue. If the queue
//exists throws an exceptionmessage_queue mq
(create_only //only create
, "message_queue" //name
,100 //max message number
,100 //max message size
) ;using boost: :interprocess;
//Creates or opens a message_queue. If the queue
//does not exist creates it, otherwise opens it.
//Message number and size are ignored if the queue
//is openedmessage_queue mq
(open_or_create //open or create
, "message_queue" //name
,100 //max message number
,100 //max message size
) ;using boost: :interprocess;
//Opens a message_queue. If the queue
//does not exist throws an exception.message_queue mq
(open_only //only open
, "message_queue" //name
) ;
使用message_queue: :remove("message_queue") ;来移除一个指定的消息队列。
接下来我们看一个使用消息队列的生产者与消息者的例子。第一个进程做为生产者第二个进程做为消费者。
生产者进程
#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
#include <vector>using namespace boost: :interprocess;int main ( )
{try{
//Erase previous message queuemessage_queue: :remove("message_queue");
//Create a message_queue.message_queue mq
(create_only //only create
, "message_queue" //name
,100 //max message number
,sizeof(int) //max message size
) ;
//Send 100 numbersfor(int i = 0; i < 100; ++i){mq.send(&i, sizeof(i), 0) ;
}
}catch(interprocess_exception &ex){std: :cout << ex.what() << std: :endl;return 1;
}return 0;
}
消费者进程
#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
#include <vector>using namespace boost: :interprocess;int main ( )
{try{
//Open a message queue.message_queue mq
(open_only //only create
, "message_queue" //name
) ;unsigned int priority;message_queue: :size_type recvd_size;
//Receive 100 numbersfor(int i = 0; i < 100; ++i){int number;mq.receive(&number, sizeof(number) , recvd_size, priority) ;if(number != i | | recvd_size != sizeof(number))return 1;
}
}catch(interprocess_exception &ex){message_queue: :remove("message_queue");std: :cout << ex.what() << std: :endl;return 1;
}message_queue: :remove("message_queue");return 0;
}
木木云怎么样?木木云品牌成立于18年,此为贵州木木云科技有限公司旗下新运营高端的服务器的平台,目前已上线美国中部大盘鸡,母鸡采用E5-267X系列,硬盘全部组成阵列。目前,木木云美国vps进行了优惠促销,1核1G/500M带宽/1T硬盘/4T流量,仅35元/月。点击进入:木木云官方网站地址木木云优惠码:提供了一个您专用的优惠码: yuntue目前我们有如下产品套餐:DV型 1H 1G 500M带宽...
SpinServers服务商也不算是老牌的服务商,商家看介绍是是2018年成立的主机品牌,隶属于Majestic Hosting Solutions LLC旗下。商家主要经营独立服务器租用和Hybrid Dedicated服务器等,目前包含的数据中心在美国达拉斯、圣何塞机房,自有硬件和IP资源等,商家还自定义支持用户IP广播到机房。看到SpinServers推出了美国独服的夏季优惠促销活动,最低月...
美国服务器哪家平台好?美国服务器无需备案,即开即用,上线快。美国服务器多数带防御,且有时候项目运营的时候,防御能力是用户考虑的重点,特别是网站容易受到攻击的行业。现在有那么多美国一年服务器,哪家的美国云服务器好呢?美国服务器用哪家好?这里推荐易探云,有美国BGP、美国CN2、美国高防、美国GIA等云服务器,线路优化的不错。易探云刚好就是做香港及美国云服务器的主要商家之一,我们来看一下易探云美国云服...