如果多线程需要操作同一个全局数据(比如消息队列),可以通过mutex对数据进行保护,从而避免竞争。消息的接收者,可以不断的获得mutex,然后检查消息队列中是否有新的消息,然后再释放mutex,通过这种忙等待的方式去检查新消息,并处理消息,但这种方式会消耗很多无谓的忙等待效率:
#include <iostream>
#include <thread>
#include <queue>
#include <string>
#include <mutex>
using namespace std;
mutex msgLock;
queue<string> 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 "<<recvMsg++<<" msg:"<<msg<<endl;
msgQueue.pop();
}
msgLock.unlock();
}
}
void sendMsg()
{
for(int i = 0; i < MSG_NUM; i++)
{
string msg = "This is msg " + to_string (i);
msgLock.lock();
msgQueu