condition avaible 怎么用
时间: 2023-07-05 16:11:22 浏览: 41
在使用 `condition_variable` 时,一般需要与 `unique_lock` 搭配使用,以实现线程之间的同步和通信。
以下是一个使用 `condition_variable` 的示例代码,其中实现了一个生产者-消费者模型:
```
#include <iostream>
#include <thread>
#include <mutex>
#include <queue>
#include <condition_variable>
std::queue<int> q;
std::mutex mtx;
std::condition_variable cv;
void producer() {
for (int i = 0; i < 10; ++i) {
std::unique_lock<std::mutex> lock(mtx);
q.push(i);
std::cout << "producer produce " << i << std::endl;
cv.notify_all();
}
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return !q.empty(); });
int val = q.front();
q.pop();
std::cout << "consumer consume " << val << std::endl;
if (q.empty()) {
break;
}
}
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
std::thread t3(consumer);
t1.join();
t2.join();
t3.join();
return 0;
}
```
在上述代码中,生产者线程不断向队列中添加元素,并通过 `cv.notify_all()` 唤醒消费者线程。消费者线程在消费队列中的元素时,如果队列为空,则通过 `cv.wait()` 进入等待状态,等待生产者线程向队列中添加元素并唤醒自己。
需要注意的是,`cv.wait()` 方法的第一个参数必须是一个 `unique_lock` 对象,可以通过 `std::unique_lock<std::mutex>` 定义一个 `unique_lock`,并传入互斥锁 `mtx`。第二个参数是一个可调用对象,用于判断条件是否满足,如果条件不满足,则线程会进入等待状态。在本例中,当队列不为空时,消费者线程可以消费队列中的元素,否则进入等待状态。
需要注意的是,在使用 `wait()` 等待条件变量时,必须先获得互斥锁,否则会产生竞态条件。另外,生产者和消费者线程需要在合适的时机结束,以免产生死锁或其他问题。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![.zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)