一、适用场景
1、condition_variable类似于信号量机制,实现了线程的等待和唤醒。
否则其中一个线程需要一直(有、无sleep两种情况)查询令一线程状态。
2、建立线程安全队列
二、condition_variable类介绍
1、无线程thread的拷贝、赋值语义
condition_variable(const condition_variable&) = delete;
condition_variable& operator=(const condition_variable&) = delete;
2、唤醒所有阻塞等待的线程
void notify_all() noexcept;
3、唤醒某一个等待的线程
void notify_all() noexcept:
4、阻塞等待的同时释放锁(原子操作)
void wait(unique_lock<mutex>& _Lck);
//可添加是否进入或持续阻塞等待判断(函数等)的重载版本
template<class _Predicate>
void wait(unique_lock<mutex>& _Lck, _Predicate _Pred)
{
// wait for signal and test predicate
while (!_Pred())
wait(_Lck);
}
5、包含超时时间的wait接口wait_for和wait_until
enum class cv_status {
// names for wait returns
no_timeout,
timeout
};
cv_status wait_for(unique_lock<mutex>& _Lck,const chrono::duration<_Rep, _Period>& _Rel_time);
//可添加是否进入或持续阻塞等待判断(函数等)的重载版本
//超时直接退出
cv_status wait_for(unique_lock<mutex>& _Lck,const chrono::duration<_Rep, _Period>& _Rel_time,_Predicate _Pred);
三、使用示例代码
#include <mutex>
std::mutex mx;
std::condition_variable cond;
long count = 0;
void wait() {
std::unique_lock<std::mutex>lock(mx);
cond.wait(lock, [&]() {
return count > 0; });
--count;
}
void signal() {
std::unique_lock<std::mutex>lock(mx);
++count;
cond.notify_one();
}
int main(int argc, char*argv[])
{
std::thread A(wait);
std::thread B(signal);
A.join();
B.join();
std::cout << count;
return 0;
}
如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810