C++

C++,第1张

如果多线程需要 *** 作同一个全局数据(比如消息队列),可以通过mutex对数据进行保护,从而避免竞争。消息的接收者,可以不断的获得mutex,然后检查消息队列中是否有新的消息,然后再释放mutex,通过这种忙等待的方式去检查新消息,并处理消息,但这种方式会消耗很多无谓的忙等待效率:

#include 
#include 
#include 
#include 
#include 
using namespace std;

mutex msgLock;
queue msgQueue;

const int MSG_NUM = 10;

void handleMsg()
{
	int recvMsg = 0;
	while(recvMsg < MSG_NUM)    //消息接收方通过不断的检查消息队列来处理新的消息,无谓的消耗运行效率
	{
		msgLock.lock();
		if(msgQueue.size() != 0)
		{
			string& msg = msgQueue.front();
			cout<<"recv "<

condition_variable提供了一种,类似于响铃的方式,当发送消息后,发送方会推送一个响铃,接收方不用一直去检查消息,而是听到了响铃就知道来了新的消息,然后才去处理消息:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

mutex msgLock;
queue msgQueue;
condition_variable newMsg;

const int MSG_NUM = 10;

void handleMsg()
{
	int recvMsg = 0;
	while(recvMsg < MSG_NUM)
	{
		unique_lock locker(msgLock);
		newMsg.wait(locker);         //等待条件变量的notify
		if(msgQueue.size() != 0)
		{
			string& msg = msgQueue.front();
			cout<<"recv "<

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/867908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)