C++关于Condition Variable
#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()用来等待直到某个时间点。
C++关于Condition Variable的更多相关文章
- 关于condition variable的理解
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- 关于Condition Variable的一些思考
可能大家都使用过condition variable(之后称cv),一些博客也对cv做了介绍,但是有的说的不完全正确,甚至有误导使用者的倾向,其实最合理的使用方式是查阅文档, 如果你英语还ok的话,h ...
- c++并发编程之条件变量(Condition Variable)
条件变量(Condition Variable)的一般用法是:线程 A 等待某个条件并挂起,直到线程 B 设置了这个条件,并通知条件变量,然后线程 A 被唤醒.经典的「生产者-消费者」问题就可以用条件 ...
- C++11中的mutex, lock,condition variable实现分析
本文分析的是llvm libc++的实现:http://libcxx.llvm.org/ C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装.不 ...
- Condition Variable使用及其Thread Cancellation线程取消
条件变量Condition Variable的一般用法: 唤醒用法: struct { pthread_mutex_t mutex; pthread_cond_t cond; //whatever v ...
- 第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)
8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同 ...
- [转] 条件变量(Condition Variable)详解
http://www.wuzesheng.com/?p=1668 条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.举个简单的例子,应用程序A ...
- 条件变量(Condition Variable)详解
条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.举个简单的例子,应用程序A中包含两个线程t1和t2.t1需要在bool变量test_cond ...
- 使用Condition Variables 实现一个线程安全队列
使用Condition Variables实现一个线程安全队列 测试机: i7-4800MQ .7GHz, logical core, physical core, 8G memory, 256GB ...
随机推荐
- mysql通用包安装
mysql 版本: mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz 解压后的初始化: mysqld --defaults-file=/etc/my.cnf --us ...
- JavaScript中concat()方法
concat(参数) 用于数组之间的连接, arrayObject.concat(arrayX,arrayX,......,arrayX) 如: var a = [1,2,3]; document.w ...
- sqlserver 事务日志过大 收缩方法解决方案
sqlserver 事务日志过大,可能会导致备份失败或者数据库出现异常,所以要定期清除sqlserver 事务日志 建议:为了防止日志文件无限扩大,可以对日志文件作一些限制. 清除sqlserver事 ...
- KMS安装后激活机器
slmgr /skms 192.168.26.82 slmgr /ato
- web工程关于500错误
昨天一直被一个诡异问题困扰,解决了之后开心得的我连玩了一下午,哈哈哈哈哈哈哈哈-- 具体问题是这样的额,本地跑的贼正常,一发到测试服务器就报500错误,具体错误信息是. HTTP Status 50 ...
- 如何实现textarea中获取动态剩余字数的实现
工作中遇到一个案例,之前没有写过,今儿啃了半个下午硬是给写出来,灰常又成就感!当然对于js大牛来说这根本不算啥,但是对于我自己的js能力又向前迈出一小步. 案例介绍:我们常见到有的网站有textare ...
- android模块混淆打包时,泛型丢失
现象:lib模块中写了一个泛型接口,在混淆之后泛型消失,提示"Error:(67, 79) 错误: 类型 ******* 不带有参数" 解决:混淆时把泛型给混淆掉了,在progua ...
- PHP造PDO对象和事务功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [移动端]rem适配
原理:给html根节点设置一个基础font-size值,然后页面的所有元素布局均相对于该font-size值采用rem单位设定.font-size的取值通过js计算. 但字体不用rem单位,原因如下: ...
- mysql-front导出数据库字典
直接导出HTML,然后打开HTML最后直接复制到word就可以了!!!之前一直在找navicat如何导出数据字典.现在发现就是这样就可以了!