c++11多线程学习笔记之四 生产消费者
#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多线程学习笔记之四 生产消费者的更多相关文章
- Java 多线程学习笔记:生产者消费者问题
前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...
- c++11多线程学习笔记之一 thread基础使用
没啥好讲的 c++11 thread类的基本使用 #include "stdafx.h" #include <iostream> #include <thre ...
- c++11多线程学习笔记之三 condition_variable使用
从windows角度来说,condition_variable类似event. 阻塞等待出发,不过condition_variable可以批量出发. 代码如下: // 1111111.cpp : 定义 ...
- c++11多线程学习笔记之二 mutex使用
// 1111111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- java进阶-多线程学习笔记
多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- Oracle学习笔记之四sp1,Oracle 11g的常用函数
从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i) 分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...
随机推荐
- aix系统使用随笔
在 Aix操作系统 中,常用的文档编辑命令是 vi.下面,我们就来学习一下有关vi的使用决窍. 在vi中,必须牢记它是有两个状态的 ---- 输入状态与命令状态.由输入状态切换 到命令状态,必须ESC ...
- Mysql 主键常用修改
修改表的定增长初始值: ALTER TABLE 表名 AUTO_INCREMENT=值;
- as2 fla 关于影片在时间轴的问题
多帧上面放着没实例名而且里面内容一致的影片,主要一开始读取了,那么跳帧的时候.会自动获取当前帧上的相同内容的影片. 但如果内容不一致的影片,那么在跳帧后,不会获取当前的影片,旧的影片也无法获取.只在当 ...
- xslt基础学习
今天下午工作完成没事,登w3c的网站学习了一下xslt的基础知识,主要是因为工作中xml用的比较多,xslt也有用到,所以在这里学习一下. XSLT:一种用于转换 XML 文档的语言. XSLT 用于 ...
- 如何选择 SQL Server 数据库跟操作系统版本
简介: 今天老大提需求, 需要一台 Windows 服务器, 需要安装最新版的 SQL Server 数据库.额, 上次搞 Windows 服务器还是4年前的事. 一.啥也没查, 直接下载操作系统.做 ...
- Rxjs 修改Observable 里的值
有这么一个对象c$: Observable<any> 修改里边的值: 声明一个subject subject: Subject<any>; 在ngOnInit()中进行初始化 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks
视频地址:https://www.cctalk.com/v/15114923888328 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人. 客户端和服务端之间相互通信,传递的数据 ...
- 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 ...
- python Count类(转)
1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...
- ftp上传下载工具类
package com.taotao.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNo ...