等待事件
条件变量(condition variable)
当一个线程等待另一个线程完成任务时,一种最基本的唤醒方式是通过另一线程触发等待事件,这种机制就称为“条件变量”。当某些线程被终止时,为了唤醒等待线程,终止线程将会向等待着的线程广播“条件达成”的信息.
Case :

首先,有一个用来在两个线程之间传递数据的队列。当数据准备好时,使用std::lock_guard对队列上锁,将数据压入队列中。再调用std::condition_variable的notify_one成员函数,对等待的线程(如果有等待线程的话)进行通知。另外一侧,有一个正在处理数据的线程,这个线程首先对互斥量上锁,之后会调用std::condition_variable的成员函数wait,传递一个unique_lock和一个谓词(只有当谓词为false时才进入等待状态,否则立刻退出wait函数,接着执行下面的语句。进入等待状态后,wait首先会释放锁,并阻塞当前线程,直到被notify_one或notify_all唤醒;被唤醒后,锁会再次被锁定,wait函数退出)。当prepareData线程调用notify_one,通知条件变量condition时,processData线程会从睡眠(等待)状态中苏醒。
线程安全的队列

在wait_and_pop函数中,如果队列为空,线程将被阻塞,直到队列中有值可用。wait_and_pop和try_pop函数都有一个返回shared_ptr的重载,目的是确保在多线程环境中安全地共享所有权。当一个线程调用wait_and_pop或try_pop函数来弹出队列的值时,该值的所有权会被转移给该线程,其他线程不能再访问该值。通过使用shared_ptr,多个线程可以共享队列中的值,同时保证在所有线程都完成对值的使用后,值的内存会自动释放。
一些不足
在等待线程调用条件变量的等待操作后,如果条件为true,那么线程将不再等待条件变量,而是继续执行后续的代码。这意味着条件变量的等待操作只能触发一次等待过程。因此,一个条件变量可能不是同步机制的最佳选择。
另外,条件变量的等待操作只能等待一个条件的满足,而不能等待一组条件的同时满足。例如,在需要等待多个数据块都准备好的情况下,条件变量的使用可能会导致问题。当其中一个数据块准备好时,等待线程被唤醒,但其他数据块仍未准备好,等待线程却会继续执行,而不是等待全部数据块都准备好。