#ifndef MY_QUEUE_H__
#define MY_QUEUE_H__ #include<list>
#include<mutex>
#include<thread>
#include<condition_variable>
#include <iostream> template <typename T>
class SyncQueue{
public:
SyncQueue(int maxSize = 10)
:maxSize_(maxSize), flagStop_(false)
{} bool IsEmpty()
{
std::lock_guard<std::mutex> locker(mutex_);
return queue_.empty();
} bool IsFull()
{
std::lock_guard<std::mutex> locker(mutex_);
return queue_.size() == maxSize_;
} void Stop()
{
{
std::lock_guard<std::mutex> locker(mutex_);
flagStop_ = true;
}
notFull_.notify_all();
notEmpty_.notify_all();
} template<typename F>
void Add(F&& x)
{
std::unique_lock<std::mutex> locker(mutex_);
notFull_.wait(locker, [this]{return flagStop_ || queue_.size() < maxSize_; });
if (flagStop_)
return;
queue_.push_back(std::forward<F>(x));
notEmpty_.notify_one();
}
public:
void Put(const T& x)
{
Add(x);
} void Put(T&& x)
{
Add(std::forward<T>(x));
} void Take(T& t)
{
std::unique_lock<std::mutex> locker(mutex_);
notEmpty_.wait(locker, [this]{return flagStop_ || !queue_.empty(); });
if (flagStop_)
return;
t = queue_.front();
queue_.pop_front();
notFull_.notify_one();
} private:
std::list<T> queue_;
std::mutex mutex_;
std::condition_variable notEmpty_;
std::condition_variable notFull_;
int maxSize_;
bool flagStop_;
}; #endif//MY_QUEUE_H__

  测试代码

// 111.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "MyQueue.h" #include <windows.h> SyncQueue<int> g_queue(15); void ProduceTask()
{
for (int i = 0; i < 20; i++)
{
g_queue.Add(i);
Sleep(50);
}
} void ConsumerTask()
{
for (int i = 0; i < 20; i++)
{
int j = 0;
g_queue.Take(j);
std::cout << j << " ";
}
std::cout << std::endl; std::cout << "stop now" << std::endl;
g_queue.Stop();
} int _tmain(int argc, _TCHAR* argv[])
{
std::thread producer(ProduceTask); // 创建生产者线程.
std::thread consumer(ConsumerTask); // 创建消费之线程.
producer.join();
consumer.join(); return 0;
}

  单线程生产 单线程消费  使用了条件变量 互斥量 线程 AUTO变量 左值右值

c++11多线程学习笔记之四 生产消费者的更多相关文章

  1. Java 多线程学习笔记:生产者消费者问题

    前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...

  2. c++11多线程学习笔记之一 thread基础使用

    没啥好讲的  c++11  thread类的基本使用 #include "stdafx.h" #include <iostream> #include <thre ...

  3. c++11多线程学习笔记之三 condition_variable使用

    从windows角度来说,condition_variable类似event. 阻塞等待出发,不过condition_variable可以批量出发. 代码如下: // 1111111.cpp : 定义 ...

  4. c++11多线程学习笔记之二 mutex使用

    // 1111111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include ...

  5. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  6. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  7. java进阶-多线程学习笔记

    多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...

  8. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  9. Oracle学习笔记之四sp1,Oracle 11g的常用函数

    从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i)    分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...

随机推荐

  1. UI5-文档-4.20-Aggregation Binding

    现在我们已经为我们的应用建立了一个良好的结构,是时候添加更多的功能了.通过添加一些JSON格式的发票数据,我们开始探索数据绑定的更多特性,这些发票数据显示在面板下面的列表中. Preview A li ...

  2. UI5-文档-4.13-Margins and Paddings

    我们的应用程序内容仍然粘在信箱的角落里.要微调布局,可以向上一步添加的控件添加空白和填充. 我们将使用SAPUI5提供的标准类,而不是手工向控件添加CSS.这些类负责一致的分级步骤.从左到右的支持和响 ...

  3. Oracle 11g超详细安装步骤

    一.首先是Oracle的安装 软件请自行到网上下载 18.等待,出现选择项时点击next 二.打开服务 三.验证数据库是否安装成功

  4. webserive学习记录3-eclipse创建webservice

    在用J2EE版的ECLIPSE学习WEBSERVICE的时候发现原来直接用该ECLIPSE就可以创建webservice,然后就自己动手用ECLIPSE自带的功能来建立WEBSERVICE服务端和客户 ...

  5. ARMV7,ARMV8

    ARMV7是32位,2011年出了ARMV8,是64位架构,IPHONE5S以上都是64位架构,说明是使用ARMV8??

  6. oc 中的id类型与类型转换

    id是oc语言中一个独特的数据类型.一种通用对象类型.可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象. 使用示例: Animal * dog = [[Dog alloc]init] ...

  7. (1)shiro简介和第一个demo

    之前一直在用shiro开发,不过只是会使用,并没有深入了解,最近有时间学习了一下,把最近学习所得分享一下. shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授 ...

  8. scala spark 调用hivecontext

    import org.apache.spark.rdd.RDD def save(data: RDD[ModelReplay], modelKey: String, dt: String): Unit ...

  9. win10磁盘碎片整理

    如果我们想要加快win10系统运行速度的话,就需要定期整理碎片才可以,减少卡顿,提高性能. 一:注意事项 固态硬盘用户千万不要使用‘磁盘碎片整理功能’,因为使用的技术不一样,使用window自带的该功 ...

  10. 大型运输行业实战_day09_1_日期转换与My97DatePicker插件使用

    1.日期转换 1.1字符串类型转换成时间Date类型 /** * 给定字符串 转变 为 Date 类型 * @param date 时间 * @param format 时间格式 如:yyyy-MM- ...