生产者消费者问题是多线程并发中一个非常经典的问题。我在这里实现了一个基于C++11的,单生产者单消费者的版本,供大家参考。

#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <mutex>
#include <thread>
#include <condition_variable>
const int bufferSize=;
struct ItemRepository
{
int item_buffer[bufferSize];
int write_pos; //current position of producer
int read_pos; //current position of consumer
std::condition_variable not_empty_con;
std::condition_variable not_full_con;
std::mutex mtx;
}itemRepository; void produce_one_item(ItemRepository*ir)
{
if (!ir)
return;
int* item_buffer = ir->item_buffer;
std::unique_lock<std::mutex> lock(ir->mtx);
if (ir->write_pos == ir->read_pos&&
item_buffer[ir->write_pos] == )//the repository is full
{
std::cout << "The producer is waiting for an empty." << std::endl;
ir->not_full_con.wait(lock);
} item_buffer[ir->write_pos] = ;//now the buffer in this position is full
std::cout << "The producer produces a new item on " << ir->write_pos << std::endl;
ir->write_pos++;
ir->not_empty_con.notify_all();//notify the consumer to consume items if (ir->write_pos == bufferSize)
ir->write_pos = ;
} void consume_one_item(ItemRepository*ir)
{
if (!ir)
return;
int* item_buffer = ir->item_buffer;
std::unique_lock<std::mutex> lock(ir->mtx); if (ir->read_pos == ir->write_pos&&
item_buffer[ir->write_pos] == )//the repository is empty
{
std::cout << "The consumer is waiting for items." << std::endl;
ir->not_empty_con.wait(lock);
} item_buffer[ir->read_pos] = ;//now the buffer in this position is empty
std::cout << "The consumer consumes an item on " << ir->read_pos << std::endl;
ir->read_pos++;
ir->not_full_con.notify_all();//notify the producer to produce new items if (ir->read_pos == bufferSize)
ir->read_pos = ;
} void produceTask()
{
for (int i = ; i < ; i++)
produce_one_item(&itemRepository);
} void consumeTask()
{
for (int i = ; i < ; i++)
{
Sleep();
consume_one_item(&itemRepository);
}
} void initializeRepository(ItemRepository*ir)
{
if (!ir)
return;
ir->read_pos = ;
ir->write_pos = ;
} int main()
{
initializeRepository(&itemRepository);
std::thread producer(produceTask);
std::thread consumer(consumeTask);
producer.join();
consumer.join();
system("pause");
return ;
}

注意我判断item_buffer中的物品是否全空或者全满的条件:生产者和消费者的位置相等时,若该位置上为空则buffer全空,若为满则buffer全满。

C++11实现生产者消费者问题的更多相关文章

  1. C++11 实现生产者消费者双缓冲

    基础的生产者消费者模型,生产者向公共缓存区写入数据,消费者从公共缓存区读取数据进行处理,两个线程访问公共资源,加锁实现数据的一致性. 通过加锁来实现 class Produce_1 { public: ...

  2. C++11 实现生产者消费者模式

    代码都类似,看懂一个,基本都能理解了. 共有代码: #include <cstdlib>#include <condition_variable>#include <io ...

  3. C++11 并发指南九(综合运用: C++11 多线程下生产者消费者模型详解)

    前面八章介绍了 C++11 并发编程的基础(抱歉哈,第五章-第八章还在草稿中),本文将综合运用 C++11 中的新的基础设施(主要是多线程.锁.条件变量)来阐述一个经典问题——生产者消费者模型,并给出 ...

  4. 综合运用: C++11 多线程下生产者消费者模型详解(转)

    生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源.本文将就四种情况分析并介绍生产者和消费者问题,它们分别是:单生产者-单消费者模型,单生产者-多消费者模 ...

  5. 再谈多线程模型之生产者消费者(总结)(c++11实现)

    0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...

  6. 再谈多线程模型之生产者消费者(多生产者和多消费者 )(c++11实现)

    0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...

  7. 再谈多线程模型之生产者消费者(多生产者和单一消费者 )(c++11实现)

    0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...

  8. 再谈多线程模型之生产者消费者(单一生产者和多消费者 )(c++11实现)

    0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现) 再谈多线程模型之生产者消费 ...

  9. 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)

    0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)[本文] 再谈多线程模型之生 ...

随机推荐

  1. MINIX3

    这个系列minix3是好早看的源码  现在都忘记的差不多了 觉得就此扔掉可惜了  今天把他全部放在博客上 1 是想和大家一起讨论下 2 是没事看看 能够加强对一个稳定性系统的理解 加厚

  2. 项目用到的icarouls类和UIEffectDesignerView类,菜单技巧,构思(金方圆)

    // //  MenuHomeViewController.m //  HFYS // //  Created by Showsoft_002 on 13-8-14. //  Copyright (c ...

  3. eclipse控台不见

  4. Struts2学习笔记

    一.struts2的工作原理 上图为struts整体结构. 1.客户端初始化一个指向servlet的请求: 2.请求通过一系列过滤器(其中的ActionContextCleanUp为可选过滤器,对st ...

  5. js 反显查询。

    反显就是点击查询之后,查询条件消失,正常解决很容易,就是查询的表单value等于返回过来的值 ,比如这样,初始化时候的devNumber是空的,点击查询的时候会有值,我们在返回来显示就可以了. < ...

  6. bn

    BN是在每一层之前对神经元的输入进行归一化,对sigmoid激活函数有效(对Relu也有效),可以更快的收敛且可以有效减少过拟合.

  7. oracle信息统计

    优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...

  8. 为什么js加事件时不要写括号

    function al(){alert("我擦")}此时,al代表这个函数的对象,al()就是直接运行了.var nfun=al;就是让nfun也指向了al,此时nfun()就相当 ...

  9. pyqt4:连接的一个带有参数的方法

    一般在pyqt4中的信号连接很少连接带参数的方法,很多时候连接带参数的方法节约不少代码量. self.s5_thread=scene.Worker5() self.log_get=QtCore.QTi ...

  10. [NOIP2013] 火柴排队(归并排序)

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...