代码简述

  • T 表示有T个生产者。同时也有T个消费者。
    然后每个生产者总共生产T个数据。
    每个消费者总共消费T个数据。
  • N表示最大随机数大数值
  • 那个信号量的实现,我是直接copy课件上的。

代码

版本一

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <queue>
#include <vector>
#include <ctime>
#include <random>
using namespace std;class Semaphore {
public:Semaphore(long count = 0) :count_(count) {}void Signal() {unique_lock<mutex> lock(mutex_);++count_;cv_.notify_one();}void Wait() {unique_lock<mutex> lock(mutex_);//第二个参数为false时才会阻塞,//为使用Lambda表达式创建匿名函数cv_.wait(lock, [=] { return count_ > 0; });--count_;}void setCount(long count = 0) {count_ = count;}
private:mutex mutex_;condition_variable cv_;long count_;
};int T, N;
int BufferSize;
queue<string> output;
queue<int> Buffer;
Semaphore BufferChoose, BufferCnt, BufferLast;void Poducer(int cnt) {srand(time(NULL));int data;for (int i = 0; i < T; ++i) {BufferLast.Wait();BufferChoose.Wait();data = rand() % N;Buffer.push(data);string temp = string("生产者") + to_string(cnt) + string("向缓冲区输出了") + to_string(data);output.push(temp);BufferChoose.Signal();BufferCnt.Signal();}
}void Consumer(int cnt) {int data;for (int i = 0; i < T; ++i) {BufferCnt.Wait();BufferChoose.Wait();data = Buffer.front();Buffer.pop();string temp = string("消费者") + to_string(cnt) + string("从缓冲区取到了") + to_string(data) + string(",平方得") + to_string(data * data);output.push(temp);BufferChoose.Signal();BufferLast.Signal();}
}int main() {T = 4;N = 100;BufferSize = 2;_ASSERT(BufferSize > 0);BufferChoose.setCount(1);BufferCnt.setCount(0);BufferLast.setCount(BufferSize);vector<thread> vt;for (int i = 0; i < 2*T; ++i) {if (i < T) vt.push_back(thread(Poducer, i));else vt.push_back(thread(Consumer, i-T));}for (int i = 0; i < 2*T; ++i) {vt[i].join();}while (!output.empty()) {cout << output.front() << endl;output.pop();}system("pause");
}

版本二

#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <queue>
#include <vector>
#include <ctime>
#include <random>
using namespace std;class Semaphore {
public:Semaphore(long count = 0) :count_(count) {}void Signal() {unique_lock<mutex> lock(mutex_);++count_;cv_.notify_one();}void Wait() {unique_lock<mutex> lock(mutex_);//第二个参数为false时才会阻塞,//为使用Lambda表达式创建匿名函数cv_.wait(lock, [=] { return count_ > 0; });--count_;}void setCount(long count = 0) {count_ = count;}
private:mutex mutex_;condition_variable cv_;long count_;
};int T, N;
int BufferSize;
queue<string> output;
queue<int> Buffer;
Semaphore BufferChoose, BufferCnt, BufferLast;void Poducer(int cnt) {srand(time(NULL)+cnt);int data;for (int i = 0; i < T; ++i) {BufferLast.Wait();BufferChoose.Wait();data = rand() % N;Buffer.push(data);string temp = string("生产者") + to_string(cnt) + string("向缓冲区输出了") + to_string(data);output.push(temp);BufferChoose.Signal();BufferCnt.Signal();}
}void Consumer(int cnt) {int data;for (int i = 0; i < T; ++i) {BufferCnt.Wait();BufferChoose.Wait();data = Buffer.front();Buffer.pop();string temp = string("消费者") + to_string(cnt) + string("从缓冲区取到了") + to_string(data) + string(",平方得") + to_string(data * data);output.push(temp);BufferChoose.Signal();BufferLast.Signal();}
}int main() {T = 4;N = 100;BufferSize = 10;_ASSERT(BufferSize > 0);BufferChoose.setCount(1);BufferCnt.setCount(0);BufferLast.setCount(BufferSize);vector<thread> vt;for (int i = 0; i < 2*T; ++i) {if (i < T) vt.push_back(thread(Poducer, i));else vt.push_back(thread(Consumer, i-T));}for (int i = 0; i < 2*T; ++i) {vt[i].join();}while (!output.empty()) {cout << output.front() << endl;output.pop();}system("pause");
}

生产者跟消费者问题(C++实现)相关推荐

  1. RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器

    本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...

  2. linux进程间通信:system V 信号量 生产者和消费者模型编程案例

    生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...

  3. Python中的生产者与消费者模式(转载)

    利用多线程和队列可以实现生产者消费者模式.该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度. 1.什么是生产者和消费者? 在线程世界里,生产者就是生产数据(或者说发布任务)的线程 ...

  4. 12.多线程的实现方式、线程安全问题的产生与解决以及生产者与消费者问题

    一.实现多线程 1.1 了解多线程 多线程是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,从而提升性能. 1.2 并发与并行 并行是指同 ...

  5. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

  6. python生产和消费模型_python queue和生产者和消费者模型

    queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. classqueue.Queue(maxsize=0) #先入先出classqueue.LifoQueue(maxsi ...

  7. 基于java多线程来实现生产者和消费者的实例

    声明:本实例是在网上看到,做了很小的修改.所以感谢之前的作者.只是一时忘了哪儿看到,没法加入链接,向原作者道歉,以示尊重.抱歉-^)... 同步栈: 1 class SycnStack { 2 pri ...

  8. PV操作——生产者和消费者

    首先,先来看几个概念: 同步:协作的过程,比如,多人开发合作. 相互排斥:争抢资源的过程.比如苦逼的大学选课: 临界区:进程中对临界资源实施操作的那段程序: 临界资源:一次仅仅能一个进程使用的资源,比 ...

  9. 线程通信问题--生产者和消费者问题

    一.问题引入:首先实现一个线程通信的实例,使用两个线程交替打印输出100以内的数字. 代码实现如下: 1 package com.baozi.exer; 2 3 public class Commun ...

  10. Java中生产者与消费者问题的演变

    想要了解更多关于Java生产者消费者问题的演变吗?那就看看这篇文章吧,我们分别用旧方法和新方法来处理这个问题. 生产者消费者问题是一个典型的多进程同步问题. 对于大多数人来说,这个问题可能是我们在学校 ...

最新文章

  1. 22.Chain of Responsibility(职责链)模式
  2. python文件读取数据-Python从文件中读取数据
  3. python贴吧回帖-python控制浏览器爬取百度贴吧回复并写入Excel
  4. 【数学建模】【APIO2015】Palembang Bridges
  5. java outputstream stringbuffer_InputStream 和OutputStream
  6. python标准输入输出用来干什么_python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出...
  7. java定义一个类_java如何定义一个类,创建它的成员变量和方法?
  8. get;get属性器
  9. Nginx 笔记与总结(11)Nginx + php-fpm + MySQL 安装 ecshop
  10. 程序员如何面试才能拿到offer
  11. rfcv函数实现_JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)...
  12. 【CodeForces - 602D】Lipshitz Sequence(思维,单调栈,斜率单调性)
  13. mysql简单部署_安装部署Mysql实例(最简单快速噢)
  14. 有序关系中的最大元与最小元
  15. 一个关于Show窗口与Invalidate();顺序问题
  16. MOSS Visual How To 系列
  17. solidworks迈迪设计宝_机械入门|那些看起来很牛X的机械结构,是如何设计的?...
  18. 公司办公提高无线网络质量解决方案
  19. windows中的DOS命令及变量
  20. 练习4-7 求e的近似值

热门文章

  1. MySQL-事务管理(基础)
  2. 武汉区块链软件技术公司:区块链如何化解溯源的短板
  3. jquery 事件:2
  4. Java之JVM 优化经验总结
  5. MySQL root密码重置 报错:mysqladmin: connect to server at 'localhost' failed的解决方案
  6. 另外五个 PHP 设计模式
  7. oracle技术之检查点及SCN深入研究
  8. C# 设置Menustrip提示框的显示
  9. JACK——TeamsManual3 Roles
  10. 计算机达人成长之路(3)连载