条件变量 condition_variable wait
2024-09-05 13:02:05
wait(阻塞当前线程,直到条件变量被唤醒)
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
void worker_thread()
{
// 等待直至 main() 发送数据
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return ready;});
// 等待后,我们占有锁。
std::cout << "Worker thread is processing data\n";
data += " after processing";
// 发送数据回 main()
processed = true;
std::cout << "Worker thread signals data processing completed\n";
// 通知前完成手动解锁,以避免等待线程才被唤醒就阻塞(细节见 notify_one )
lk.unlock();
cv.notify_one();
}
int main()
{
std::thread worker(worker_thread);
data = "Example data";
// 发送数据到 worker 线程
{
std::lock_guard<std::mutex> lk(m);
ready = true;
std::cout << "main() signals data ready for processing\n";
}
cv.notify_one();
// 等候 worker
{
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{return processed;});
}
std::cout << "Back in main(), data = " << data << '\n';
worker.join();
}
最新文章
- exynos4412中断编程
- python 打印 网格
- 笔试常考的Linux命令大全
- macaca运行报错之chrome-driver问题处理,关闭 Chrome 的自动更新
- IOS第四天(4:下一题和选框的实现)
- ArcGIS中的坐标系定义与转换 (转载)
- Custom ASP.NET Application into SharePoint --整合ASP.NET应用程序到SharePoint
- FLASH轮播广告 在谷歌浏览器中不显示的解决办法(FLash轮播放广告在谷歌浏览器中无法显示处理方法)
- Java串口通信具体解释
- DNN Module - Responsive Html Tabs 3 介绍
- java算法 蓝桥杯 乘法运算
- 理解C++ lvalue与rvalue
- 如何在命令行中让python2和python3同存
- C#基础知识之IOC
- [认证授权] 5.OIDC(OpenId Connect)身份认证(扩展部分)
- 最大流 USTC1280
- 如何在grails2.3.x中的fork模式下进行调试?-【grails】
- Mybatis学习总结(二)——Mapper代理开发
- MBR详解
- Maya中输出nuke脚本的方法