#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的更多相关文章

  1. 关于condition variable的理解

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  2. 关于Condition Variable的一些思考

    可能大家都使用过condition variable(之后称cv),一些博客也对cv做了介绍,但是有的说的不完全正确,甚至有误导使用者的倾向,其实最合理的使用方式是查阅文档, 如果你英语还ok的话,h ...

  3. c++并发编程之条件变量(Condition Variable)

    条件变量(Condition Variable)的一般用法是:线程 A 等待某个条件并挂起,直到线程 B 设置了这个条件,并通知条件变量,然后线程 A 被唤醒.经典的「生产者-消费者」问题就可以用条件 ...

  4. C++11中的mutex, lock,condition variable实现分析

    本文分析的是llvm libc++的实现:http://libcxx.llvm.org/ C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装.不 ...

  5. Condition Variable使用及其Thread Cancellation线程取消

    条件变量Condition Variable的一般用法: 唤醒用法: struct { pthread_mutex_t mutex; pthread_cond_t cond; //whatever v ...

  6. 第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)

    8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同 ...

  7. [转] 条件变量(Condition Variable)详解

    http://www.wuzesheng.com/?p=1668 条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.举个简单的例子,应用程序A ...

  8. 条件变量(Condition Variable)详解

    条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.举个简单的例子,应用程序A中包含两个线程t1和t2.t1需要在bool变量test_cond ...

  9. 使用Condition Variables 实现一个线程安全队列

    使用Condition Variables实现一个线程安全队列 测试机: i7-4800MQ .7GHz, logical core, physical core, 8G memory, 256GB ...

随机推荐

  1. 关于如何在cenos7.0上实现mysql数据库远程连接

    设置mysql允许别的客户机控制的权限 mysql -uroot -p #此处为本地linux帐号密码 select user,host from mysql.user; #查看mysql表对应use ...

  2. react native 页面跳转

    React Native目前有几个内置的导航器组件,一般来说我们首推Navigator.它使用纯JavaScript实现了一个导航栈,因此可以跨平台工作 场景简单来说其实就是一个全屏的React组件. ...

  3. BZOJ2408 混乱的置换

    这道题即THUSC 2015 t3...只不过数据范围$n, m ≤ 10^5$ 可以上网查这个鬼畜的东西"Burrows-Wheeler Transform" 这道题要用到解压缩 ...

  4. ORACLE 误删除视图恢复

    1.使用 dba_views 回退到特定时间段,查看定义 select view_name,text from (select * From dba_views AS OF TIMESTAMP(SYS ...

  5. virtual_login

    from selenium import webdriverimport timedriver = webdriver.Chrome()driver.set_window_position(30, 4 ...

  6. Linux Mint 17使用小结

    用过蛮多的linux系统 linux mint是我比较喜欢和常用的一个系统,装的是linux mint xfce 64位版本,在这里记录使用中遇到的一些问题及解决的方法,备忘,方便以后查看. 1.首先 ...

  7. MySQL5.6 GTID、多线程复制

    MySQL5.6新特性GTID.多线程复制 在Oracle发布MySQL5.6看到众多新特性之后很兴奋,包括对复制的改进.在MySQL5.5半同步复制之后MySQL5.6又引入GTID.多线程复制,在 ...

  8. #1000 A + B (hihoCoder)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 求两个整数A+B的和 输入 输入包含多组数据.每组数据包含两个整数A(1 ≤ A ≤ 100)和B(1 ≤ A ≤ 100) ...

  9. java基础之 序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.       把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬 ...

  10. AngularJs的UI组件ui-Bootstrap分享(七)——Buttons和Dropdown

    在ui-Bootstrap中,Buttons控件和Dropdown控件与form表单中的按钮和下拉框名字很像,但实际上这两个控件有新的含义. 先说Buttons,它是一组按钮,用来实现form表单中的 ...