多线程同步之生产者---消费者模型

Linux下的生产者-消费者模型多线程同步实现 本文还有配套的精品资源,点击获取 简介:生产者-消费者模型是操作系统课程设计中的一个关键部分,通过模拟资源的生产与消耗来展示多线程同步和协作。在Linux系统中,结合pthread库、互斥锁和信号量等机制,可以使用C语言创建此模型。模型涉及互斥锁的资源保护、信号量的数量控制,以及调试和性能优化的必要步骤。通过本课程设计,学生可以加深对多线程编程和同步机制的理解,并在实践中学... 阅读详情

多线程同步之生产者---消费者模型

线程同步是个老生常谈的问题了,在这里我将通过一个Java多线程程序,来说明控制相互交互的线程之间的运行进度,使程序运行总是既高效又稳定。这个多线程程序将采用生产者---消费者模型,来说明怎么样实现多线程的同步。

如果让我定义一下什么是消费者、生产者:我觉得可以把系统中使用某种资源的线程称为消费者,产生该种资源的线程称为生产者。在下面的Java的应用程序中,生产者线程向一个线程安全的堆栈缓冲区中写(PUSH)数据,消费者从该堆栈缓冲区中读(POP)数据,这样,这个程序中同时运行的两个线程共享同一个堆栈缓冲区资源。

类Producer是生产者模型,其中的run方法中定义了生产者线程所做的操作,循环调用push()方法,将生产的100个字母送入堆栈中,每次执行完push操作后,调用sleep方法睡眠一段随机时间。

类Consumer是消费者模型,循环调用pop方法,从堆栈取出一个字母,一共取100次,每次执行完push操作后,调用sleep方法睡眠一段随机时间。

先看下同步堆栈类的源码:

 

 

生产者源码:

消费者源码:

 

最后让我们来看看主程序main所在类的源码:

 

转自:http://blog.youkuaiyun.com/loomman/archive/2009/03/11/3982085.aspx

生产者消费者JAVA课程设计 package producer; import java.util.Vector;//输入java矢量 class SyncStack {//实现堆栈功能,不能同时读写 private Vector buffer//私人接口向量缓冲区 = new Vector //新建向量 (400,200); char contents; private boolean ava=false; public synchronized char get() {//出栈 while (ava==false) //如果生产者还没有产生字符就一直等待 { try { this.wait(); } catch (InterruptedException e)//当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常 { e. printStackTrace(); } } ava=false; notifyAll(); return contents; } public synchronized void push(char c) { while(ava==true){ try { wait(); } catch (InterruptedException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } }//入栈 ava=true; this.notify();//通知其它线程把数据出栈 Character charObj = new Character(c); buffer.addElement(charObj); contents=c; } public void print(char c) { // TODO 自动生成方法存根 } } class ControlEnter {//每行输出结果的个数 public static int count = 0; void counter() { count++; if(count ==5) { System.out.println(); count = 0; } } } class Producer implements Runnable {//生产者类 private SyncStack theStack;//生产者类获得的字符都来自同步堆栈 private ControlEnter controlenter; public Producer (SyncStack s,ControlEnter ce) { theStack = s; controlenter = ce; } public void run() { char c; for (int i = 0; i < 30; i++) { c = (char)(Math.random() * 26 + 'a');//随机产生30个小写字母 theStack.push(c);//存入堆栈 System.out.print("生产者产生: " + c +" "); controlenter.counter( ); try { Thread.sleep//线程休眠 ((int)(Math.random() * 200));//以0~200ms的速度随机 } catch (InterruptedException e) //当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常 { e.printStackTrace( ); } } } } class Consumer implements Runnable {//消费者类 private SyncStack theStack;//消费者类获得的字符都来自同步堆栈 private ControlEnter controlenter; public Consumer (SyncStack s,ControlEnter ce) { theStack = s; controlenter = ce; } public void run() { char value; for (int i=0; i < 30; i++) {//从堆栈中取数,并输出 value = theStack.get();//取出生产者产生的字母 System.out.print("消费者消费: " + value+" ");//消费者输出 controlenter.counter( ); try { Thread.sleep((int) (Math.random() * 2000));//控制取数的速度:0~2s/*每读取一个字符线程就睡眠*/ } catch (InterruptedException e)//当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常 { e.printStackTrace(); } } } } public class B {//主线程总调度 public static void main(String []args) { ControlEnter ce = new ControlEnter(); SyncStack stack = new SyncStack();//下面的消费者类对象和生产者类对象所操作的是同一个同步堆栈对象 Producer p1 = new Producer(stack,ce); new Thread(p1).start();//生产者线程启动 Consumer c1 = new Consumer(stack,ce); new Thread(c1).start();//消费者线程启动 } } 立即下载

相关推荐

多线程中的生产者与消费者问题

有关多线程中生产者与消费者问题,本文档详细介绍了此类问题,并有详细的例子!!

多线程模拟实现生产者/消费者模型

题目如下:在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。多个生产者线程会在同一时间运行,生产数据,并放到内存中一个共享的区域。期间,多个消费者线程读取内存共享区,消费里面的数据。 分析 在下面Java应用程序中,生产者线程向一个线程安全的堆栈缓冲区中写(PUSH)数据,消费者从该堆栈缓冲区中读(POP)数据,这样,这...

weixin_30404405的博客 474

ARM架构下Horizon Client安装全攻略:从依赖检查到环境变量配置

本文详细介绍了在ARM架构设备上安装VMware Horizon Client的全过程,包括依赖检查、软件包获取、系统部署和环境变量配置。特别针对华为鲲鹏等ARM平台,提供了从基础准备到性能优化的完整指南,帮助用户高效完成虚拟桌面客户端的部署与调优。

github5actions的博客 551

[编程题] Java基础编程练习题(二)

点击上方“Coder编程”,选择“置顶公众号”技术文章第一时间送达!Java基础编程练习题(二)1.编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出2...

Coder编程的博客 2480

【OpenVINO】OpenVINO C# API 常用 API 详解与演示

在本文中我们基于模型推理流程,演示了OpenVINO C# API使用方法,并和OpenVINO C++API进行了对比,展示了OpenVINO C# API与C++API在使用的区别,这也对使用过C++ API的开发者十分友好,上手会十分容易。在本文中我们只展示了基础的模型推理流程代码,也对各个API进行了测试,针对其他比较高级的API方法,我们后续会继续进行测试其他API方法,向各位开发者展示其用法。

grape_yan的博客 1539

电流互感器的使用分析

有关电流互感器使用的注意事项,回头再看,耳目一新。

qq_46757048的博客 2万+

多线程模拟实现生产者/消费者模型 (借鉴)

 在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。多个生产者线程会在同一时间运行,生产数据,并放到内存中一个共享的区域。期间,多个消费者线程读取内存共享区,消费里面的数据。 分析 在下面Java应用程序中,生产者线程向一个线程安全的堆栈缓冲区中写(PUSH)数据,消费者从该堆栈缓冲区中读(POP)数据,这样,这个程序中同时运行的两个线程共享同一...

weixin_33831196的博客 176

Tauri开发环境配置避坑指南:从Rust到Node.js的全流程实战

本文是一份详尽的Tauri开发环境配置实战指南,重点解析了从Rust工具链安装、Node.js版本管理到IDE配置的全流程。文章深入探讨了包管理器选择、依赖锁定、网络镜像加速等关键环节,并提供了开发与构建过程中典型问题的排查思路与解决方案,旨在帮助开发者高效避坑,顺利搭建跨平台桌面应用开发环境。

w3x4y的博客 292

Linux:多线程---同步&&生产者消费者模型

文章摘要: 本章深入探讨线程同步机制,重点介绍了条件变量的实现原理和使用方法。通过VIP自习室的类比,阐述了条件变量如何配合互斥锁解决线程调度问题。文章分析了代码中常见的线程安全问题,如共享资源访问冲突和数据竞争。随后引入生产者消费者模型,解释其通过"超市"缓存区实现生产消费解耦的原理,并指出模型中的三类线程关系:生产者间互斥、消费者间互斥、生产消费间互斥与同步。最后通过代码示例展示了条件变量的实际应用,包括线程等待、唤醒机制以及临界资源状态判断的注意事项。

知北游天的博客 3152

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 943

VMware Workstation 17 Pro 保姆级教程:手把手教你安装银河麒麟 Kylin V10 SP3 国产系统

本文提供VMware Workstation 17 Pro安装银河麒麟Kylin V10 SP3的详细教程,涵盖环境准备、虚拟机配置、系统安装及优化全流程。通过分步指导和实用技巧,帮助用户高效搭建国产操作系统开发测试环境,特别适合技术自主可控需求场景下的虚拟化实践。

weixin_30879169的博客 645

多线程生产者 - 消费者模型中的同步机制研究

本文深入探讨多线程编程中经典的生产者 - 消费者模型,在该模型存在多个生产者线程和多个消费者线程的场景下,利用信号量和互斥锁实现线程间的有效同步。生产者线程负责向有界缓冲区写入数据,消费者线程从缓冲区读取数据。文中详细阐述了设计思路、实现过程,并对同步机制进行了全面分析,旨在确保在缓冲区满时生产者线程阻塞,缓冲区空时消费者线程阻塞,以实现高效、稳定的多线程数据处理。

jarfg35的博客 1123

探索Vortex开源GPGPU:RISC-V SIMT架构(4-1),Execute SFU(1)

本文详细分析了Vortex RISC-V内核6级流水线中Execute阶段的SFU(特殊功能单元)模块。重点介绍了SFU的数据流结构,包含dispatch_unit、pe_switch、csr_unit、wctl_unit和gather_unit五个子模块。文章深入解析了warp控制指令wspawn和tmc的实现机制:wspawn用于激活指定数量的warp并设置新PC值,tmc则用于控制线程掩码和warp状态。通过C代码和汇编指令的对照分析,阐明了这些指令在并行计算中的关键作用,包括线程激活、状态切换和执行

weixin_55313207的博客 1363

【Java笔记】——多线程同步机制模拟生产者/消费者模型

    上篇介绍线程,说到线程同步机制,其中说到加锁的机制,如果加锁不合理,则会产生“死锁”。如果加锁的位置合理,则会解决多线程访问同一数据的问题。多线程访问的问题,其中很典型的一个模型就是生产者/消费者模型,下面就简单介绍一下多线程同步如何模拟生产者/消费者模型。       生产者/消费者模型理解起来并不难,就如社会中的生产消费一样,总要保持一个平衡。生产者需要生产产品,消费者需要消费产品...

Coder Yasmine 3996

基于多传感器融合的智身四足机器狗楼梯环境SLAM系统设计与实现

本文设计了一种基于多传感器融合的四足机器狗楼梯环境SLAM系统。系统采用Jetson Orin NX为主控制器,集成RealSense D435i深度相机和Livox Mid360激光雷达,在ROS2框架下实现平面定位精度<5cm、楼梯环境下导航不漂移的目标。通过多层次传感器融合策略、运动学约束优化和状态切换机制,解决了楼梯环境下的定位累积误差问题,实现了平面与楼梯环境的自动识别切换及精度复位功能。硬件设计注重传感器布局优化和精确标定,软件架构采用分层设计,确保实时性能。该系统为四足机器人在复杂地形中

huanghm88的专栏 238

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

多线程同步,信号,生产者消费者模型

1.线程互斥它是对的吗?合理吗?(任何场景) 2.怎么解决饥饿问题? 3.条件编译 1.生产者和消费者模型 2.编写代码实现一个基于堵塞队列的生产者消费者模型 4.POSIX信号量 5.环形队列

li1829146612的博客 520

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

多线程编程:条件变量、同步、竞态条件与生产者消费者模型

本文系统解析了多线程编程中的核心概念与应用模型。首先详细阐述了条件变量的工作原理,包括其引入背景、使用场景、与互斥锁的配合方式,以及解决"忙等待"问题的机制。其次深入剖析了同步概念与竞态条件问题,强调同步机制对数据安全和避免线程饥饿的重要性。最后重点介绍了生产者-消费者模型,通过"321原则"(2个角色、3个组件、1个目标)解析其解耦特性、并发支持和负载均衡能力,并讨论了典型应用场景与潜在问题的解决方案。全文从底层原理到实践应用,构建了一套完整的多线程编程知识体系。

祯的博客 1092

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Linux】多线程 -> 线程同步与基于BlockingQueue的生产者消费者模型

线程同步、条件变量、生产者消费者模型、基于阻塞队列的生产者消费者模型......

2202_75924820的博客 1183

[linux仓库]多线程同步:基于POSIX信号量实现生产者-消费者模型[线程·柒]

本文介绍了POSIX信号量在多线程同步中的应用。通过环形队列实现生产者-消费者模型,演示了信号量的初始化(sem_init)、销毁(sem_destroy)以及PV操作(sem_wait/sem_post)的使用方法。文章重点分析了单生产单消费场景下的并发控制,并扩展讨论多生产多消费时引入两把锁的解决方案,既保证线程安全又维持并发效率。最后通过代码实例展示了信号量在Linux环境下的具体应用。

egoist2023的博客 1362

多线程并发编程核心:互斥与同步的深度解析及生产者消费者模型两种实现

本文介绍了多线程编程中的互斥与同步机制。互斥通过互斥锁实现,保护临界资源避免竞争条件;同步通过条件变量和信号量实现,协调线程执行顺序。文章详细讲解了互斥锁、条件变量和POSIX信号量的接口用法,并基于生产者消费者模型,分别使用阻塞队列(条件变量+互斥锁)和循环队列(信号量+双互斥锁)实现了两种同步方案。阻塞队列将资源整体使用,循环队列将资源分块使用,体现了不同场景下同步工具的选择策略,为解决多线程并发问题提供了实用方案。

Kaisir777的博客 1010

【Linux学习】多线程——同步 | 条件变量 | 基于阻塞队列的生产者消费者模型

介绍了生产者消费者模型的原理及特点,同步及条件变量的概念和应用,详细介绍了基于阻塞队列的生产者消费者模型的原理、实现及应用。

weixin_63726869的博客 1542

Linux:详解多线程(线程同步、信号量和生产者与消费者模型的实现)(三)

目录

zw的博客 1398

Linux详解 --- 多线程3: 线程同步、生产者消费者模型

线程同步、条件变量、生产者消费者模型、基于阻塞队列的生产者消费者模型

wuqiongjin的博客 558
上一篇: ireport+jasperreport 报表html显示
下一篇: GUI 布局 CardLayout
wlxtaking
博客等级 码龄17年 51粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值