C++ condition_variable 学习笔记
基本概念
std::condition_variable 是 C++ 标准库中用于多线程同步的重要工具之一。它可以与 std::mutex 一起使用,实现线程之间的等待和唤醒机制。通过 std::condition_variable,一个线程可以等待另一个线程满足某个特定条件,而不需要使用轮询等待的方式,这样有助于节省 CPU 资源,提高程序的性能。
内部原理
std::condition_variable 的内部原理通常是基于操作系统提供的条件变量或信号量实现的。在大多数情况下,它使用了操作系统底层的原子操作和同步机制,以确保线程的安全等待和唤醒。具体的实现细节可能会因操作系统和编译器而异。
成员函数
std::condition_variable 类提供了几个重要的成员函数,用于线程的等待和唤醒:
| 名称 | 描述 |
|---|---|
| notify_one() | 唤醒一个正在等待的线程。 |
| notify_all() | 唤醒所有正在等待的线程。 |
| wait(lock) | 在持有 lock 的情况下等待,直到被唤醒。 |
| wait_for(lock, timeout) | 在持有 lock 的情况下等待一段时间,直到被唤醒或超时。 |
| wait_until(lock, time_point) | 在持有 lock 的情况下等待到指定时间点,直到被唤醒或超时。 |
使用技巧
避免虚假唤醒
在使用 std::condition_variable 进行等待时,存在虚假唤醒的可能性,即即使没有调用 notify_one() 或 notify_all(),线程也有可能被唤醒。为了避免这种情况,建议在等待条件时使用 predicate 进行判断。predicate 是一个函数或函数对象,用于检查条件是否满足。例如:
std::condition_variable cv;
std::mutex mtx;
bool data_ready = false;
void consumer() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock

4350

被折叠的 条评论
为什么被折叠?



