C++关于Condition Variable
2024-10-14 03:37:08
#include <condition_variable>
#include <mutex>
#include <future>
#include <iostream>
#include <thread>
#include <queue>
using namespace std; queue<int> q;
mutex queueMutex;
condition_variable queueCondVar; void provider(int val)
{
for (int i = ; i < ; ++i)
{
{
this_thread::sleep_for(chrono::milliseconds());
cout << "\nWait\n";
this_thread::sleep_for(chrono::milliseconds());
lock_guard<mutex> lg(queueMutex);
q.push(val + i);
}
queueCondVar.notify_one();
//this_thread::sleep_for(chrono::milliseconds(val));
}
} void consumer(int num)
{
while (true)
{
int val;
{
unique_lock<mutex> ul(queueMutex);
queueCondVar.wait(ul, []{return !q.empty(); });
val = q.front();
q.pop();
}
cout << "consumer" << num << ":" << val << endl;
}
} int main()
{
auto p1 = async(launch::async, provider, );
auto p2 = async(launch::async, provider, );
auto p3 = async(launch::async, provider, ); auto c1 = async(launch::async, consumer, ); //this_thread::sleep_for(chrono::milliseconds(5000));
auto c2 = async(launch::async, consumer, ); //system("pause");
p1.get();
p2.get();
p3.get();
c1.get();
c2.get();
return ;
}
在consumer中:我们要使用
unique_lock<mutex> ul(queueMutex);
queueCondVar.wait(ul, []{return !q.empty(); });
因为等待的函数中有可能锁定和解锁mutex.
另外,condition variable也许有所谓的假醒,所以我们使用
[]{return !q.empty(); }来防止假醒对程序的影响。
注意,两个consumer的并发等待被通知次序是不确定的。
还要condition variable也提供给你一个接口允许你等待某个最大时间量:wait_for()用来等待一个时间段,wait_until()用来等待直到某个时间点。
最新文章
- ajax处理的方式
- Java字符串中常见的10个问题
- 常用的MIME类型
- [转]svn常用命令
- Find和FirstOrDefault()有什么区别?
- windows 上执行python pywin32.exe
- random circle
- hadoop(三):hdfs 机架感知
- 用Robotium 去实现点击imageview
- ok6410驱动usb摄像头
- Redis Sentinel的Redis集群(主从&;Sharding)高可用方案
- 【CSS】less 学习小结
- Linux - 主机的细部权限规划:ACL 的使用
- SSL WSS HTTPS
- react 监听页面滚动
- web 本地存储 (localStorage、sessionStorage)
- Oracle 数据库 Only 导出空表的方法
- SpringMVC——SpringMVC 的入门案例
- Keil debugging techniques and alternative printf (SWO function)
- php 常用的标签比较