Cpp notify_all 和 notify_one使用实例
时间: 2024-06-09 16:10:30 浏览: 7
notify_all 和 notify_one 都是 C++ 中的条件变量(condition variable)的成员函数,用于唤醒等待线程。
下面是一个简单的使用实例:
```
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker(int id)
{
std::unique_lock<std::mutex> lock(mtx);
while (!ready) {
std::cout << "Worker " << id << " is waiting..." << std::endl;
cv.wait(lock);
}
std::cout << "Worker " << id << " is working..." << std::endl;
}
void notifier()
{
std::unique_lock<std::mutex> lock(mtx);
ready = true;
cv.notify_all();
}
int main()
{
std::thread t1(worker, 1);
std::thread t2(worker, 2);
std::thread t3(worker, 3);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::thread t4(notifier);
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}
```
上面的代码创建了三个 worker 线程和一个 notifier 线程。worker 线程会等待 ready 变量为 true,notifier 线程会将 ready 变量设置为 true,并通过 notify_all 函数唤醒所有等待线程。
运行上面的代码,输出结果如下:
```
Worker 1 is waiting...
Worker 2 is waiting...
Worker 3 is waiting...
Worker 3 is working...
Worker 2 is working...
Worker 1 is working...
```
可以看到,三个 worker 线程都等待在条件变量上,直到 notifier 线程唤醒它们,并且它们同时开始工作。如果将 notify_all 改为 notify_one,那么只会唤醒一个等待线程,输出结果会有所不同。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)