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 ...
随机推荐
- selenium自动化测试通过localstorage绕过登陆
引言: 做自动化测试,尤其是通过page object模式做UI自动化测试,登陆是个很麻烦的事情,比如你想对某个页面进行测试,一般直接链接到那个页面是不可能的,总是需要先登陆,然后刷新页面才能到想要的 ...
- c++官方文档
来自官方文档...感谢老王指出需要c++11,一下代码全在c++11下编译,编译参数加入 -std=c++11 #include<stdio.h> #include<iostrea ...
- 温故而知新-MySQL高级编程
1 load data infile语句 MySQL下的命令 登录mysql命令行模式 load data infile "/var/www/1.txt" into table ...
- hive 上篇
hive 是以hadoop为基础的数据仓库,使用HQL查询存放在HDFS上面的数据,HSQL是一种类SQL的语句,最终会被编译成map/reduce,HSQL可以查询HDFS上面的数据:不支持记录级别 ...
- HTML5 Canvas ( 图形变换, 升级版的星空 ) translate, rotate, scale
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- IE浏览器中的加载项怎么删除
IE浏览器中的加载项是一些软件或者浏览器的功能控件,我们可以通过禁用.开启来控制是否使用某些加载项,同时可以将一些加载项删除. 比如当我们遇到了一些不好的加载项,想要将它删除,通过这篇经验,教大家怎么 ...
- VB6 padleft padright
Public Function PadLeft(ByVal s As String, ByVal i As Integer, ByVal c As String) If i > LenB( ...
- js中Math.round、parseInt、Math.floor和Math.ceil小数取整小结
以前经常在代码中看到Math.round.parseInt.Math.floor和Math.ceil这四个函数,虽然知道结果都可以返回一个整数,但是对他们四者的区别还是不太清楚,今天就做一个小结. 一 ...
- salt常用模块及API
saltstack提供了非常丰富的功能模块,涉及操作系统的基础功能,常用工具支持等,更多模块信息见官网模块介绍:https://docs.saltstack.com/en/latest/ref/mod ...
- Inspector视图中的get/set使用
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public int width { ...