#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. aix系统使用随笔

    在 Aix操作系统 中,常用的文档编辑命令是 vi.下面,我们就来学习一下有关vi的使用决窍. 在vi中,必须牢记它是有两个状态的 ---- 输入状态与命令状态.由输入状态切换 到命令状态,必须ESC ...

  2. Mysql 主键常用修改

    修改表的定增长初始值: ALTER TABLE 表名 AUTO_INCREMENT=值;

  3. as2 fla 关于影片在时间轴的问题

    多帧上面放着没实例名而且里面内容一致的影片,主要一开始读取了,那么跳帧的时候.会自动获取当前帧上的相同内容的影片. 但如果内容不一致的影片,那么在跳帧后,不会获取当前的影片,旧的影片也无法获取.只在当 ...

  4. xslt基础学习

    今天下午工作完成没事,登w3c的网站学习了一下xslt的基础知识,主要是因为工作中xml用的比较多,xslt也有用到,所以在这里学习一下. XSLT:一种用于转换 XML 文档的语言. XSLT 用于 ...

  5. 如何选择 SQL Server 数据库跟操作系统版本

    简介: 今天老大提需求, 需要一台 Windows 服务器, 需要安装最新版的 SQL Server 数据库.额, 上次搞 Windows 服务器还是4年前的事. 一.啥也没查, 直接下载操作系统.做 ...

  6. Rxjs 修改Observable 里的值

    有这么一个对象c$: Observable<any> 修改里边的值: 声明一个subject subject: Subject<any>; 在ngOnInit()中进行初始化 ...

  7. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks

    视频地址:https://www.cctalk.com/v/15114923888328 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人. 客户端和服务端之间相互通信,传递的数据 ...

  8. nstall neovim on Ubuntu 16.04

    https://neovim.io/ To install NeoVim on Ubuntu, run 1 2 3 sudo add-apt-repository ppa:neovim-ppa/sta ...

  9. python Count类(转)

    1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...

  10. ftp上传下载工具类

    package com.taotao.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNo ...