如果多线程需要 *** 作同一个全局数据(比如消息队列),可以通过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 "<
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)