生产者,消费者 多线程

  

#include <iostream>
#include <vector>
#include <thread>
#include <mutex>

const size_t SIZE = 10;
using ElemTy = char;
ElemTy arr[SIZE];

size_t begin = 0;
size_t end = 0;

std::mutex prdc_m;
std::mutex cnsm_m;

void produce() {
  for (;;) {
    if ((end + 1) % SIZE != begin) {
      {
        std::lock_guard<std::mutex> lg(prdc_m);
        arr[end] = ‘o‘;
        end = (end + 1) % SIZE;
        std::cout << "produce and size is " << (end - begin) % SIZE << std::endl;
      }
    }
  }
}

void consume() {
  for (;;) {
    if (begin != end) {
      ElemTy e;
      {
        std::lock_guard<std::mutex> lg(cnsm_m);
        e = arr[begin];
        begin = (begin + 1) % SIZE;
        std::cout << "consume and size is " << (end - begin) % SIZE << std::endl;
      }
    }
  }
}

int main() {
  std::vector<std::thread> vc;
  std::vector<std::thread> vp;
  for (int i = 0; i < 10; ++i) {
    vc.push_back(std::thread(consume));
  }
  for (int i = 0; i < 10; ++i) {
    vp.push_back(std::thread(produce));
  }

  for (auto &t : vc) {
    t.join();
  }

  for (auto &t : vp) {
    t.join();
  }

  return 0;
}
时间: 2024-10-03 01:42:56

生产者,消费者 多线程的相关文章

生产者消费者-(多线程同步和互斥)

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待条件变量的条件成立而挂起(此时不再占用cpu):另一个线程使条件成立(给出条件成立信号).为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起. /* 等待条件 */ /* 注意:pthread_cond_wait为阻塞函数.解开锁,再等待.等条件满足时,需要抢到锁,才可以被唤醒*/ pthread_cond_wait(&cond_pro,&mutex); /* 激发条件 */ /* 所有因为不满足条件的

生产者消费者多线程练习过程中遇到的bug

package threadStudy1; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @ClassName: ProducerConsumer * @author yudexiao

python基础 信号量 semaphore evevt 线程queue 生产者消费者模型

线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量 1 import threading, time, queue 2 3 def test(name): 4 semaphore.acquire() #获取信号量锁 5 print('my name is %s' %name) 6 time.sleep(1) 7 semaphore.release() #释放信号量锁 8 9 semaphore = threading

生产者消费者模型实现多线程异步交互

[Python之旅]第六篇(五):生产者消费者模型实现多线程异步交互 消息队列 生产者消费者模型 多线程异步交互 摘要:  虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应该还包括Python的消息队列,因为这里多线程异步交互是通过Python的消息队列来实现的,因此主要内容如下: 1 2 3 4 1.生产者消费者模型:厨师做包子与顾客吃包子 2.Python的消息队列 3.利用... 虽然标题是"生产者消费者模型实现多线程异步交互",但这里要说的应

Java多线程之~~~~使用wait和notify实现生产者消费者模型

在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满 的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产品,这就 涉及到了在多线程中的条件判断,java为了实现这些功能,提供了wait和notify方法,他们可以在线程不满足要求的时候 让线程让出来资源等待,当有资源的时候再notify他们让他们继续工作,下面我们用实际的代码来展示如何使用wait和 notify来实现生产者消费者这个经典的模型. 首先是

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

利用多线程编写 生产者-消费者 关系

package ace; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; /** * 利用多线程编写 生产者-消费者 关系 */ public class ProductionAndConsumption { private static ArrayList<String> products = new ArrayList<String>(); // 产品 private

多线程的并发执行应用(生产者消费者模式)

在实际的开发中我们为了提高CPU的利用率,也提高程序的执行效率,我们经常使用多线程进行对数据进行并发处理,下面我举一个多线程并发执行的实例,大致意思就是 一个简单的生产者消费者模式,二个线程进行存数据,一个线程进行取数据. import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class BlockingQueueTest { /** * @param a

多线程之生产者消费者模式

最近在项目中需要使用使用多线程实现一种功能,和生产者消费者模式类似,因此,学习了下生产者消费者模式的多线程实现.在生产者消费者模式中,通常有两类线程, 即若干个生产者线程和若干个消费者线程.生产者线程负责提交用户请求,消费者线程则负责处理生产者提交的任务.生产者和消费者之间则通过共享内存缓冲区进行通信. 在这里我们选择BlockingQueue做为共享内存缓冲区. 首先,我们构建生产者生产的,和消费者需要处理的数据PCData,即相关任务数据. public class PCData { pri

多线程:生产者/消费者模式

生产者/消费者模式 实际上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式. 生产者消费问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,消费者则可以从仓库中取走产品.解决生产者/消费者问题的方法可以分为两类: 采用某种机制保护生产者和消费者之间的同步: 生产者和消费者之间建立一个管道. 第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式. 第二种管道缓冲不易控制,被传输数据对象不易于封装,实用性不强. 同步问题的核心在于:如何保证