std::condition_variable
是 C++11 引入的一个重要工具,用于多线程编程中的线程同步。它通常与 std::mutex
一起使用,帮助线程在特定条件满足时等待或唤醒。以下是一个简单的示例,展示了如何在 C++ 中使用 std::condition_variable
:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 互斥量,用于保护共享数据
std::condition_variable cv; // 条件变量
bool data_ready = false; // 共享数据,表示数据是否准备就绪
void producer_function() {
// 模拟生产数据的过程
std::this_thread::sleep_for(std::chrono::seconds(1));
// 通过互斥量锁定,修改共享数据
{
std::lock_guard<std::mutex> lock(mtx);
data_ready = true;
}
// 通知等待的消费者线程
cv.notify_one();
}
void consumer_function() {
// 等待数据准备就绪
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return data_ready; }); // 等待条件变量满足
// 处理数据
std::cout << "Consumer thread: Data is ready!\n";
}
int main() {
// 创建生产者和消费者线程
std::thread producer(producer_function);
std::thread consumer(consumer_function);
// 等待线程结束
producer.join();
consumer.join();
return 0;
}
这个例子中,主线程创建了一个生产者线程和一个消费者线程。生产者线程在一秒钟后将 data_ready
设置为 true
,然后通过 cv.notify_one()
通知消费者线程。消费者线程使用 cv.wait()
在 data_ready
变为 true
之前等待,并在条件满足后输出消息。
这种结构允许线程在需要等待某些条件满足时暂时挂起,而不是通过轮询来浪费处理器资源。
std::condition_variable
的 wait
函数内部并不是使用轮询来实现的。它的实现通常依赖于操作系统提供的原生线程同步机制,比如 POSIX 线程库中的条件变量。具体来说,std::condition_variable
的 wait
函数会在等待条件不满足时将当前线程置于休眠状态,并释放所关联的互斥量。当其他线程通过 notify_one()
或 notify_all()
发送信号时,等待的线程会被唤醒并重新获取互斥量,然后重新检查条件是否满足。
这种方式避免了线程轮询,因此可以显著减少不必要的 CPU 消耗,提高了多线程程序的效率和性能。
std::condition_variable::wait() 函数需要一个互斥量来保护条件变量的等待操作。std::unique_lock 可以在构造时将互斥量锁定,并在 wait() 函数内部自动释放锁,这符合条件变量等待操作的要求。