std::condition_variable
是 C++ 标准库中用于线程间同步的类,通常与 std::mutex
结合使用。它提供了一种在多线程环境下等待条件变量满足的机制,以避免忙等(busy-waiting)并减少 CPU 资源的浪费。
以下是 std::condition_variable
的基本用法:
1. 包含头文件
首先,你需要包含 <condition_variable>
头文件:
cpp
#include <condition_variable>
2. 创建一个条件变量和一个互斥量
通常情况下,你会同时使用一个 std::condition_variable
和一个 std::mutex
。std::mutex
用于保护共享数据,而 std::condition_variable
用于在特定条件下通知等待线程。
cpp
std::condition_variable cv;
std::mutex mtx;
3. 等待条件变量满足
在一个线程中,你可以使用 std::unique_lock
来锁定互斥量,并调用 wait
函数来等待条件变量满足:
cpp
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock);
这将会让当前线程等待,直到另一个线程调用 notify_one()
或 notify_all()
来通知条件变量已经满足。
4. 通知条件变量满足
在另一个线程中,你可以通过调用 notify_one()
或 notify_all()
来通知等待的线程条件变量已经满足:
cpp
std::unique_lock<std::mutex> lock(mtx);
cv.notify_one(); // 或者使用 cv.notify_all();
完整示例
cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::condition_variable cv;
std::mutex mtx;
bool ready = false;
void worker() {
std::this_thread::sleep_for(std::chrono::seconds(1));
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one();
}
int main() {
std::thread t(worker);
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return ready; });
}
std::cout << "Worker thread is done!" << std::endl;
t.join();
return 0;
}
在这个示例中,主线程等待工作线程完成。工作线程会等待 1 秒钟后将 ready
标记设为 true
,然后通过 cv.notify_one()
通知主线程条件已满足。主线程在收到通知后打印消息并结束。
这就是 std::condition_variable
的基本用法。通过结合使用互斥量和条件变量,你可以实现线程之间的有效同步与通信。