多线程经典模型——生产者消费者模型

C语言之生产者消费者模型 多线程并发应用程序有一个经典模型,即生产者/消费者模型。系统中,产生消息的是生产者,处理消息的是消费者消费者生产者通过一个缓冲区进行消息传递。生产者产生消息后提交到缓冲区,然后通知消费者可以从中取出消息进行处理。消费者处理完信息后,通知生产者可以继续提供消息。 要实现这个模型,关键在于消费者生产者这两个线程进行同步。也就是说:只有缓冲区中有消息时,消费者才能够提取消息;只有消息已被处理, 阅读详情

生产者消费者模型

​ 电脑能够一边放音乐一边看网页,靠的就是多线程和多进程,在现代软件中,多线程和多进程操作显得不可缺少,尤其是现在处理器几乎全是多核,如果单线程就太可惜了。

任务:

  • 生产者消费者模型是广为使用的多线程模型,常用的消息队列也是基于这个模型展开的,因此你可以在网上找到很多相关的代码和解释,图文并茂的那种
  • 生产者Producer 3个p1, p2, p3, 消费者Consumer3个c1, c2, c3, 传送带最多同时容纳5个数据
  • 生产者和消费者一次都只能生产/消耗 1个面包
  • 生产者在rand(0.5, 2)的时间内产生下一个面包,消费者在rand(0.5, 2)的时间内消耗下一个面包
  • 面包是一个类,具有属性producer = "xx"xx是生产者的名字, consumer = "xx"xx是消费者的名字,生产时改变producer属性,消费时打上consumer属性,初始化时两个属性都为空
  • 队列加锁,一次只能一个生产者进入放面包,一次只能一个消费者去拿面包,以免造成数据冲突

代码

package main


import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)


type Bread struct {
	Consumer, Producer string
}


func timeout(chan2 chan bool) {
	time.Sleep(time.Duration(3) * time.Second)
	chan2 <- true
}


func Wait() {
	t := rand.Intn(1500) + 500
	time.Sleep(time.Duration(t) * time.Millisecond)
}


func Print_Bread(t Bread) {
	fmt.Printf("%s哼哧哼哧地吃下了一包%s撒下的狗粮!\n", t.Consumer, t.Producer)
}


func Consumer(Name string, chan1 chan Bread, mux *sync.Mutex) {
	for true {
		Wait()
		mux.Lock()
		chan2 := make(chan bool)
		go timeout(chan2)
		select {
		case t := <-chan1:
			t.Consumer = Name
			Print_Bread(t)
		case <-chan2:
			fmt.Printf("竟然没人撒狗粮,%s很生气\n", Name)
		}
		mux.Unlock()
	}
}


func Producer(Name string, chan1 chan Bread, mux *sync.Mutex) {
	var t Bread
	for true {
		Wait()
		mux.Lock()
		chan2 := make(chan bool)
		go timeout(chan2)
		t.Producer = Name
		select {
		case chan1 <- t:
			fmt.Printf("%s撒狗粮啦!\n", Name)
		case <-chan2:
			fmt.Printf("竟然不能撒狗粮,%s很生气\n", Name)
		}
		mux.Unlock()
	}
}


func main() {
	rand.Seed(time.Now().Unix())
	chan1 := make(chan Bread, 5)
	mux := &sync.Mutex{}
	go Producer("司严哥哥", chan1, mux)
	go Producer("贾**和她", chan1, mux)
	go Producer("张**和她的他", chan1, mux)
	go Consumer("汪*泷", chan1, mux)
	go Consumer("二哈", chan1, mux)
	go Consumer("拉布拉多犬", chan1, mux)
	time.Sleep(time.Duration(2) * time.Minute)
}

从零到一:桌面宠物的硬件架构设计工程实践 本文详细介绍了基于STM32F103C8T6主控平台的桌面宠物机器人硬件架构设计工程实践。内容涵盖电源管理、舵机控制、PCB布局及系统调试等核心环节,为硬件爱好者提供从零到一的完整开发指南,助力打造稳定可靠的智能桌面伴侣。 阅读详情

相关推荐

YoloV10改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。改进方法简单高效,需要发论文的同学不要错过!

m0_47867638的博客 1052

三种方式实现生产者-消费者模型

前言 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。此同时,消费者也在缓冲区消耗这些数据。该...

Sicimike的博客 4771

清华版labview教程.rar_LABVIEW 入门_labview 教程_labview教程_清华

labview 的事件程序清华版教程,给初学者学习

多线程——生产者消费者模型

多线程生产者消费者模式 1.什么是生产者消费者模型生产者+消费者+阻塞队列 它可以用来解决: 1.生产消费速度不匹配的问题; 2.软件开发过程中解耦。 阻塞情况 唤醒情况 1.队列已满,阻塞生产者 1.队列不满,唤醒生产者 2.队列已空,阻塞消费者 2.队列不空,唤醒消费者 2.wait()/notify()实现 注意:阻塞时只能用wait()方法,不能用sleep()方法,因为此时不释放锁。假设队列为空,那么消费者sleep,此时消费者不释放锁,那么生产者拿不到锁就不

m0_38057941的博客 387

多线程设计模式:生产者-消费者

生产者消费者:就好比厨师和食客,我们来看代码理解一下 https://www.cnblogs.com/xiaoxi/p/7910868.html https://www.jianshu.com/p/71a5089afe13

念念不忘,必有回响 3593

多线程生产者消费者模型

1. 基础知识: 1. 什么是生产者-消费者模式: 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者消费者的模式,A相当于生产者,B相当于消费者。 2. 为什么要使用生产者消费者模式: 在多线程开发中,如果生产者生产数据的速度很快,而消费者消费数据的速度很慢,那么生产者就必须等待消费者消费完了数据才能够继续生产数据,因为生产那么多也没有地方放啊;同理如果消费者的速度大于生产者那么消费者就会经常处理等待状态,所以为了

dev_zyx的博客 1820

生产者消费者模型多线程工作)

生产者消费者模型多线程工作)

xiao_xiao21的博客 652

利用多线程和信号量,互斥量实现的经典生产者消费者模型

多线程并发应用程序有一个经典模型,即生产者/消费者模型。系统中,产生消息的是生产者,处理消息的是消费者消费者生产者通过一个缓冲区进行消息传递。生产者产生消息后提交到缓冲区,然后通知消费者可以从中取出消息进行处理。消费者处理完信息后,通知生产者可以继续提供消息。 要实现这个模型,关键在于消费者生产者这两个线程进行同步。也就是说:只有缓冲区中有消息时,消费者才能够提取消息;只有消息已被处理,

baymin_dly的博客 1061

C# 多线程编程 经典模型 生产者消费者问题

语言:C#   总起: 在编写Unity程序的时候一般不用考虑到多线程的问题,但了解经典的三个问题对以后编写多线程会有所帮助,嘛,主要是好奇就研究看看。   多线程的两个主要的对象是Mutex互斥体和Semaphore信号量,当然现在语言都提供类似lock的关键字使用更加方便。不过既然C#提供了这样的实现,我还是以这两个对象作为展开。   Mutex互斥体和Semaphore信号量:

暗光之痕的博客 1万+

java 多线程经典模型--生产者消费者模型

生产者消费者模型是Java多线程经典模型,它的主要意思是有一个公共的商品区,生产者项商品区生产商品,消费者从中取走商品,最理想的状态就是生产者生产一个商品消费者就从商品中取走一个商品,二者同时执行,所以采用多线程机制,随着多线程的使用就容易产生商品取出错误,商品生产重复问题,能有效解决此问题的方式就是线程的等待唤醒加静态代码块。有必要说明一下线程的等待和唤醒都是Object类的方法。 clas...

qq_41578371的博客 233

Java生产者消费者模型——经典多线程例子

Java生产者消费者模型——经典多线程例子,简单上手

weixin_67026971的博客 685

java多线程经典案例之生产者消费者模型

在java基础中生产者消费者的案例是不可避免的一个经典问题 要想实现这个经典的案例我们要先了解实现它需要一些什么东西 1.容器:用于存放生产者生产的产品,消费者从中消费商品 2.生产者:不断生产商品,直到容器满了,停止生产。 3.消费者:不断消耗商品,直至容量里的商品为空,停止消费。 4锁:生产者消费者向容器里添加和删除元素的时候可以同步进行 我们来看实现代码 package P_and_C; /** * Created by Lei on 2020/11/3 9:39 */ import jav

LableFirst的博客 300

Python多线程的一个经典设计模式--->生产者消费者模型

参考

KaelCui的博客 227

Python爬虫的经典多线程方式,生产者消费者模型

在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我们需要感知线程之间的状态,交换线程之间的信息是一件非常复杂和困难的事情。因为我们没有更高级的系统权限,也没有上帝视角,很难知道目前运行的状态的全貌,所以想要设计出一个稳健运行没有bug的功能,不仅非常困难,而且调试起来非常麻烦。 很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免

Python学习Q群696455390 668

多线程生产者-消费者模型实战解析linux经典面试题

该代码实现了一个典型的生产者-消费者多线程模型。使用环形缓冲区(MAX=10)存储数据,通过信号量(sem_product/sem_customer)实现线程同步,配合互斥锁(fastmutex)保证共享资源安全访问。生产者随机生成数据并写入缓冲区,消费者读取数据,两者通过模运算实现环形缓冲。主函数初始化同步原语并启动线程。代码存在线程创建变量错误、缺少错误检查等问题,建议增加退出机制、优化锁粒度,并考虑条件变量替代方案。该模型适用于网络处理、日志系统等场景,通过调整休眠时间可模拟不同处理速度。

m0_67799835的博客 932

Java生产者-消费者模型多线程协同的经典实现

这种方式需手动控制锁的获取释放,逻辑较为繁琐,但能直观理解线程通信的底层原理。该模型的核心构成包含三大组件:生产者线程负责生成数据并写入共享缓冲区,消费者线程从缓冲区读取数据并处理,共享缓冲区则作为两者的数据交互媒介,通常通过数组、集合或阻塞队列实现。在Java多线程编程中,生产者-消费者模型是解决线程间数据交互任务协同的经典范式,其核心是分离“数据生成”“数据消费”的职责,通过线程间通信实现生产消费的动态平衡,广泛应用于消息队列、任务调度、缓冲处理等场景,是构建高并发、解耦系统的基础。

dddxdls的博客 322

JAVA 多线程经典案例-生产者消费者模型【使用wait/notify实现】

  生产者消费者模型实现细节 生产者生产产品到公共仓库,消费者消费公共仓库中产品。 情况一:当公共仓库产品达到仓库容量上限,生产者停止生产; 情况二:当公共仓库没有产品,或达到设置的仓库容量下限,消费者停止消费; 情况三:当公共仓库产品达到容量上限时,消费者消费一次,就可以让生产者继续生产; 情况四:当公共仓库没有产品时,生产者生产一次,就可以让消费者继续消费; 功能实现说明 ...

程序员随笔 396

java 多线程之 wait(),notify(),notifyAll()以及经典生产者消费者模型

http://www.cnblogs.com/anran_guojianjun/archive/2009/04/14/1435278.html       wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll() 的功能.因为都个对像都有锁,锁是每个对像的基础,当然操作锁的

Mason's Blog 855

C# Thread 多线程 Monitor 锁 Producer And Consumer 生产者消费者 经典模型

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 using System.Threading.Tasks; 7 8 namespace ConsoleA...

weixin_30342827的博客 184
上一篇: 高并行中的限制——互斥锁
下一篇: Golang命令行输入
李峻枫
博客等级 码龄10年 110粉丝 571原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值