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
关注
打赏