C++ 线程锁中的条件变量用法 举例子
时间: 2023-09-10 16:08:01 浏览: 45
当使用条件变量时,一个常见的示例是生产者-消费者问题。在这个问题中,有一个生产者线程负责生产某种产品,并将其放入一个共享的缓冲区中,同时有一个消费者线程负责从缓冲区中获取产品并进行消费。
下面是一个简单的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
bool ready = false; // 表示缓冲区是否有产品
int data = 0; // 共享数据
void producer()
{
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟生产过程
std::lock_guard<std::mutex> lock(mtx); // 获取互斥锁
data = 42; // 生产产品
ready = true; // 表示缓冲区有产品
cv.notify_one(); // 唤醒等待的消费者线程
}
void consumer()
{
std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
cv.wait(lock, []{ return ready; }); // 等待条件满足(缓冲区有产品)
std::cout << "Consumed: " << data << std::endl; // 消费产品
}
int main()
{
std::thread producerThread(producer);
std::thread consumerThread(consumer);
producerThread.join();
consumerThread.join();
return 0;
}
```
在上面的示例中,生产者线程通过获取互斥锁来保护共享数据的访问,并在生产完产品后设置`ready`为`true`表示缓冲区有产品,并通过条件变量`cv`唤醒等待的消费者线程。
消费者线程在获取互斥锁后,使用条件变量`cv`的`wait`函数来等待条件满足(即缓冲区有产品)。当条件满足时,消费者线程被唤醒,输出消费的产品信息。
通过互斥锁和条件变量的配合使用,生产者和消费者线程可以实现同步和协调,确保正确地进行生产和消费操作。