0. C++ 中的锁
两种最常用的:互斥锁、条件锁,此外还有自旋锁
1. C++ 中的条件变量
2. 生产者消费者模型
引出虚假唤醒的问题
3. 虚假唤醒
有多个线程在wait同一个条件变量时,当条件变量发出notify_one的时候,各个线程去竞争锁,此时,只能有一个线程得到锁,但是,其他线程在收到notify_one信号时,线程已经从wait队列换到锁竞争的队列了(不再等待notify的通知了,而是等待其他线程解除对锁的占用),一旦某个线程拿到锁了,就会立刻向下执行代码,但此时,条件可能已经变了,不是预期的条件了。
解决办法:
-
- 把if改成while,在收到通知消息后循环判断条件是否成立。
-
- 传递一个lambda函数给wait函数的第二个参数,该lambda方法返回等待的条件。该方式可以理解为,在收到notify信号后,线程先竞争锁,得到锁后,再检查一下lambda函数的返回值,如果返回值是true,则结束wait状态,继续向下执行。如果返回false,则解锁,继续wait。本质上等价于解决办法1。