C++多线程学习[六]: 多线程之间的同步
一、同步问题
实际开发场景中有很多需要同步的情况,例如,音频和视频的同步输出、或者通讯能够第一时间同步接受处理…
二、多线程同步demo
可以看到cond可以阻塞等待(wait)可以通知一个线程(notify_one)也可以通知所有的线程(notify_all)等等 这里采用的通知一个线程即notify_one。
#include<iostream>
#include<thread>
#include<mutex>
#include<list>
#include<sstream> //拼接字符串
using namespace std;
condition_variable cond; //通知信号
static mutex mtx;
list<string> mesg;
void ReadTest(int i)
{
for (;;)
{
if (mesg.empty())
{
this_thread::sleep_for(10ms);
continue;
}
unique_lock<mutex> lock(mtx);
cond.wait(lock);
cout << i<<"thread recive mseg :" << mesg.front() << endl;
mesg.pop_front();
}
}
void WriteTest()
{
int i = 0;
for (;;)
{
this_thread::sleep_for(30ms);
unique_lock<mutex> lock(mtx);
stringstream ss;
ss << "mesg" << i++;
mesg.push_back(ss.str());
cond.notify_one();
cout << "send mesg" << endl;
}
}
int main()
{
thread th(WriteTest);
th.detach();
for (int i = 0;i < 3;i++)
{
thread th(ReadTest,i+1);
th.detach();
}
getchar();
return 0;
}
总的来说就是一个线程需要通知其他线程时通过发送通知信号让其他阻塞线程等待接受信号,达成同步的效果。