C++11 条件变量
C++11中的条件变量提供了用户等待的同步机制,在同步队列的应用中有很大的便利。
简单同步队列代码如下(SimpleSyncQueue.h):
#ifndef SIMPLESYNCQUEUE_H
#define SIMPLESYNCQUEUE_H #include <thread>
#include <condition_variable>
#include <mutex>
#include <list>
#include <iostream> using namespace std; template<typename T>
class SimpleSyncQueue
{
public:
SimpleSyncQueue()
{ } void Put(const T& x)
{
//调用Put函数的线程获取互斥量,如果互斥量正在被占用,将等待
std::lock_guard<std::mutex> lk(m_mutex); //保存数据
m_queue.push_back(x); //通知等待m_notEmpty的线程
m_notEmpty.notify_one();
} void Take(T& x)
{
//调用Take函数的线程获取互斥量,如果互斥量正在被占用,将等待
std::unique_lock<std::mutex> locker(m_mutex); m_notEmpty.wait(locker,[this] { if(m_queue.empty())
{
cout<<"现在队列为空,请稍等"<<endl;
} return !m_queue.empty();
}); x = m_queue.front();
m_queue.pop_front();
} bool Empty()
{
std::lock_guard<std::mutex> lk(m_mutex); return m_queue.empty();
} size_t Size()
{
std::lock_guard<std::mutex> lk(m_mutex); return m_queue.size();
} private:
std::list<T> m_queue; /* 用于等待的同步变量 */
std::mutex m_mutex; /* 用于多线程同步的互斥量 */
std::condition_variable m_notEmpty; /* 用于等待的同步变量 */
}; #endif // SIMPLESYNCQUEUE_H
测试代码如下:
#include <QCoreApplication> #include "simplesyncqueue.h" SimpleSyncQueue<int> testQueue;
bool threadrun = true; void consumerthread()
{
int get; while(threadrun)
{
testQueue.Take(get); cout<<"consumer thread get: "<<get<<endl;
} cout<<"consumerthread exit"<<endl;
} void producerthread()
{
char in = ; while(threadrun)
{
cin>>in; cout<<"user input: "<<in<<endl; switch(in)
{
case 'p': testQueue.Put((int)); break;
case 'q': threadrun = false; break;
default: break;
}
} cout<<"producerthread exit"<<endl;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); std::thread t1(consumerthread); std::thread t2(producerthread);
t1.detach(); t2.join(); cout<<"program exit"<<endl; return a.exec();
}
测试结果如下:

看看condition_variable类中的wait函数定义,参见http://en.cppreference.com/w/cpp/thread/condition_variable/wait
关于这个函数,其实疑惑的是pred ()函数会被执行多少遍的问题。cppreference里的详解里给了一个 Equivalent to:
while (!pred()) {
wait(lock);
}
从Equivalent To可以看到pred开始被执行一次。
C++11 条件变量的更多相关文章
- c++11の条件变量
一.条件变量的引入 std::condition_variable 解决了死锁并且控制的资源的访问顺序二避免不必要的等待.当互斥操作不够用而引入的.比如,线程可能需要等待某个条件为真才能继续执行,而一 ...
- c++11 条件变量 生产者-消费者 并发线程
http://baptiste-wicht.com/posts/2012/04/c11-concurrency-tutorial-advanced-locking-and-condition-vari ...
- C++11 中的线程、锁和条件变量
转自:http://blog.jobbole.com/44409/ 线程 类std::thread代表一个可执行线程,使用时必须包含头文件<thread>.std::thread可以和普通 ...
- C++11并发——多线程条件变量std::condition_variable(四)
https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 htt ...
- c++11中的线程、锁和条件变量
void func(int i, double d, const string& s) { cout << i << ", " << d ...
- C++11并行编程-条件变量(condition_variable)详细说明
<condition_variable >头文件主要包含有类和函数相关的条件变量. 包括相关类 std::condition_variable和 std::condition_variab ...
- Windows:C++11并发编程-条件变量(condition_variable)详解
<condition_variable >头文件主要包含了与条件变量相关的类和函数.相关的类包括 std::condition_variable和 std::condition_varia ...
- APUE学习笔记——11 线程同步、互斥锁、自旋锁、条件变量
线程同步 同属于一个进程的不同线程是共享内存的,因而在执行过程中需要考虑数据的一致性. 假设:进程有一变量i=0,线程A执行i++,线程B执行i++,那么最终i的取值是多少呢?似乎一定 ...
- c++11多线程记录6:条件变量(condition variables)
https://www.youtube.com/watch?v=13dFggo4t_I视频地址 实例1 考虑这样一个场景:存在一个全局队列deque,线程A向deque中推入数据(写),线程B从deq ...
随机推荐
- BZOJ2246 [SDOI2011]迷宫探险 【记忆化搜索dp + 概率】
题目 输入格式 输出格式 仅包含一个数字,表示在执行最优策略时,人物活着走出迷宫的概率.四舍五入保留3位小数. 输入样例 4 3 3 2 .$. A#B A#C @@@ 143 37 335 85 9 ...
- linux 安装软件出现/tmp 磁盘不足时 解决方案
1.解决办法 mkdir 文件夹——你可以使用的文件夹 比如说 mkdir /mnt/tmp 然后只要export TMPDIR=/mnt/tmp 这样就不会出现 tmp文件夹不够用的情况
- golang-random随机数
在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand", 对应两种应用场景. 一."math/ra ...
- java实现简单的算法
排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插 ...
- java 基础 5 String StringBuffer StringBuilder
String是不可变的,原因 1是可以缓存hash值,因为String的hash值经常被使用,例如String用作HashMap等.不可变特性 使得hash值不变,因此只需要进行一次计算: 2Str ...
- CocoaPods为project的全部target添加依赖支持
在使用CocoaPods时.pod install默认仅仅能为xcodeproject的第一个target加入依赖库支持.假设要为全部的target添加可依照例如以下步骤进行 两种情 1. 编辑Pod ...
- 【Todo】RTP/RTCP/RTSP/SIP/SDP 等多媒体传输和会话协议
参考 http://m.blog.csdn.net/article/details?id=6211447
- [转]gzip,bzip2,tar,zip命令使用方法详解
原文:http://blog.chinaunix.net/uid-20779720-id-2547669.html 1 gzipgzip(1) 是GNU的压缩程序.它只对单个文件进行压缩.基本用法如下 ...
- C++字符串转数字,数字转字符串
1. 字符串转数字 如将"32"转为32,将"3.1415"转为3.1415,将"567283"转为567283.使用: //Convert ...
- annotation使用示例
annotation使用示例 学习了:https://www.imooc.com/learn/456 Annotation编写规则:@Target,@Retention,设置一些String.int属 ...