C++11提供了两个条件变量的实现:std::condition_variable和std::condition_variable_any。std::condition_variable只可与std::mutex一起使用;std::condition_variable_any更加灵活,但需要额外的性能代价。
先看看std::condition_variable的接口:
被等待的线程(唤醒别的线程)操作流程如下:
- 获取std::mutex(如通过std::lock_guard)
- 在持有锁时修改数据
- 在sdt::condition_variable上执行notify_one或notify_all(不需要为通知持有锁)
等待被唤醒的线程操作流程如下:
- 获取std::mutex(如通过std::unique_lock)
- 执行wait、wait_for或wait_until ,该操作会自动释放互斥,并悬挂线程的执行
- std::condition_variable被通知、超时或虚假唤醒发生,线程被唤醒,且自动重获得互斥。之后线程应检查条件,若唤醒是虚假的,则继续等待
借用在线手册上的例子(https://zh.cppreference.com/w/cpp/thread/condition_variable):
(例子中main线程将数据以全部变量的形式给worker线程处理,处理完后再回到main线程)
#include
#include
#include
#include
#include
std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
void worker_thread()
{
// 等待直至 main() 发送数据
std::unique_lock lk(m);
cv.wait(lk, [] {return ready; });
// 等待后,我们占有锁。
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?