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 条件变量的更多相关文章

  1. c++11の条件变量

    一.条件变量的引入 std::condition_variable 解决了死锁并且控制的资源的访问顺序二避免不必要的等待.当互斥操作不够用而引入的.比如,线程可能需要等待某个条件为真才能继续执行,而一 ...

  2. c++11 条件变量 生产者-消费者 并发线程

    http://baptiste-wicht.com/posts/2012/04/c11-concurrency-tutorial-advanced-locking-and-condition-vari ...

  3. C++11 中的线程、锁和条件变量

    转自:http://blog.jobbole.com/44409/ 线程 类std::thread代表一个可执行线程,使用时必须包含头文件<thread>.std::thread可以和普通 ...

  4. C++11并发——多线程条件变量std::condition_variable(四)

    https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 htt ...

  5. c++11中的线程、锁和条件变量

    void func(int i, double d, const string& s) { cout << i << ", " << d ...

  6. C++11并行编程-条件变量(condition_variable)详细说明

    <condition_variable >头文件主要包含有类和函数相关的条件变量. 包括相关类 std::condition_variable和 std::condition_variab ...

  7. Windows:C++11并发编程-条件变量(condition_variable)详解

    <condition_variable >头文件主要包含了与条件变量相关的类和函数.相关的类包括 std::condition_variable和 std::condition_varia ...

  8. APUE学习笔记——11 线程同步、互斥锁、自旋锁、条件变量

    线程同步     同属于一个进程的不同线程是共享内存的,因而在执行过程中需要考虑数据的一致性.     假设:进程有一变量i=0,线程A执行i++,线程B执行i++,那么最终i的取值是多少呢?似乎一定 ...

  9. c++11多线程记录6:条件变量(condition variables)

    https://www.youtube.com/watch?v=13dFggo4t_I视频地址 实例1 考虑这样一个场景:存在一个全局队列deque,线程A向deque中推入数据(写),线程B从deq ...

随机推荐

  1. 【bzoj2597】[Wc2007]剪刀石头布 动态加边费用流

    题目描述 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道于统计有多少这 ...

  2. 【Luogu】P2827蚯蚓(堆转队列)

    按照国际惯例先发题目链接‍ woc从4月就开始做这sb题.最开始30分升到65分不管了,直到最近几天升到85分,再到今天AC.激动的心情自然是那些一遍就A或者一小时以内就A的神犇难以想象的. 下面说说 ...

  3. Spring Cloud 从入门到精通

    Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量. 本 ...

  4. hdu 1390

    #include<stdio.h> int main() { int t,n,a[1001]; scanf("%d",&t); while(t--) { sca ...

  5. uva 10090 二元一次不定方程

    Marbles Input: standard input Output: standard output I have some (say, n) marbles (small glass ball ...

  6. 中国余数定理 2(codevs 3990)

    题目描述 Description Skytree神犇最近在研究中国博大精深的数学. 这时,Sci蒟蒻前来拜访,于是Skytree给Sci蒟蒻出了一道数学题: 给定n个质数,以及k模这些质数的余数.问: ...

  7. linux的crontab定时任务命令

    linux的crontab定时任务命令 cron是一个linux下的定时执行工具. 启动.停止.重启.重新载入配置/sbin/service crond start|stop|restart|relo ...

  8. ajax 提交数组,mybatis 数组接受

    function jinxingzhong() { // 配送单编号:psd2017090103 var divHtml = ""; $.ajax({ type: "PO ...

  9. MySQL主从架构配置

    MySQL主从架构配置有两台MySQL数据库服务器master和slave,master为主服务器,slave为从服务器,初始状态时,master和slave中的数据信息相同,当master中的数据发 ...

  10. java队列--queue详细分析

    ---恢复内容开始--- Queue:基本上一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口,LinkedList实现了Li ...