条件变量
- 参考C++ Reference对于条件变量的解释和例程:
https://en.cppreference.com/w/cpp/thread/condition_variable - 条件变量和互斥锁一般结合使用。因为线程处于等待状态中,一般需要查看一个全局变量或共享的变量的状态,来决定是否停止等待继续运行程序。对于此全局变量,必须要原子化的操作锁定,查看状态、结束等待才有意义。
(不加锁全局变量被其他线程随便乱改,代码就运行混乱了。原子化就是加锁解锁和wait唤醒是原子化同时进行的。) - std::condition_variable cv
{
std::lock_guard lk(mtx);
while ( condition )
cv.wait(lk, [] {return ready;});
}
// lk是lock_guard,可以在作用范围内管理mtx,构造产生时加锁,析构删除时解锁。
// cv.wait需要传入lk,以及一个函数。这里为了简单用了匿名函数。
- 上面代码在加锁后,进入判断条件,条件成立,就进入wait状态并解锁,交出mtx的使用权。
- 在接收到notify信号后,加锁,并判断while条件。如果不满足条件了,跳出while,此时正好lk到了生命周期末尾,解锁。
如果仍满足条件,while内的wait仍然会执行,wait等待并解锁。
lock_guard
上面讲了lock_guard就是用来管理mtx的。unique_lock是一种更强大,功能更多的lock_guard。
互斥锁
如果代码里已经有互斥锁,现在要添加条件变量,就需要将lock_guard与mtx整合,将lock()与unlock()以lock_guard的作用域来表示,其中条件判断就采用while循环,这样反而会简化代码的结构,更加清晰。
标签:加锁,lock,lk,C++,互斥,guard,wait From: https://www.cnblogs.com/sparkFY/p/17440669.html