原因:记录一下条件变量的内部流程
概况:通过条件变量实现线程间同步。
伪代码如下:需要和锁配合使用,用到了unique_lock实现互斥。具体流程如下:
线程a:
1:首先利用unique_lock加锁。
2: 调用condition_variable的wait方法进行阻塞等待条件满足。wait内部流程首先进行unique_lock解锁,然后判断第二个参数是否为ture,如果为true则退出。否则阻塞等到下次信号的触发。
线程b:
1:首先利用unique_lock加锁
2:do something(一般进行修改wait等待条件的变量)
3:调用unique_lock解锁。
4:调用condition_variable的nodify方法进行信号触发。
#include<thread>
#include<condition_variable>
#include<mutex>
std::mutex mx;
std::condition_variable cv;
void T1()
{
std::unique_lock<std::mutex>lock(mx);//首先加锁
cv.wait(lock, [] {return false; });//内部第一步先释放mx锁,然后判断lamda函数返回值是否为 true.如果为true则进行返回。否则阻塞等到消息传来。即使消息来了也会进行第二个参数判断,避免假唤醒操作。
}
void T2()
{
std::unique_lock<std::mutex>lock(mx);//首先加锁
lock.unlock();//处理完数据后进行解锁
cv.notify_one();//触发信号.告知等待线程。
}
条件变量的使用重点为wait方法的第二个参数。通过第二个参数的合理设置可以避免线程间不能及时响应的问题。
总结:以上就是条件变量的使用