求生产者 消费者 模型消费者问题代码

processBasic 用c++实现生产者消费者问题的源码,界面清晰易懂,包含详细的说明文档 -Thread 进程与线程 238万源代码下载-
&文件名称: processBasic
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 25224 KB
&&上传时间:
&&下载次数: 11
&&提 供 者:
&详细说明:用c++实现生产者消费者问题的源码,界面清晰易懂,包含详细的说明文档-The source code of the producer-consumer problem with c++, the interface is clear and easy to understand, contains detailed documentation
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&processBasic\Debug\processBasic.exe&&............\.....\processBasic.ilk&&............\.....\processBasic.pdb&&............\processBasic\buffer.cpp&&............\............\buffer.h&&............\............\Debug\buffer.obj&&............\............\.....\CL.read.1.tlog&&............\............\.....\CL.write.1.tlog&&............\............\.....\link-cvtres.read.1.tlog&&............\............\.....\link-cvtres.write.1.tlog&&............\............\.....\link.1560-cvtres.read.1.tlog&&............\............\.....\link.1560-cvtres.write.1.tlog&&............\............\.....\link.1560.read.1.tlog&&............\............\.....\link.1560.write.1.tlog&&............\............\.....\link.3028-cvtres.read.1.tlog&&............\............\.....\link.3028-cvtres.write.1.tlog&&............\............\.....\link.3028.read.1.tlog&&............\............\.....\link.3028.write.1.tlog&&............\............\.....\link.4924-cvtres.read.1.tlog&&............\............\.....\link.4924-cvtres.write.1.tlog&&............\............\.....\link.4924.read.1.tlog&&............\............\.....\link.4924.write.1.tlog&&............\............\.....\link.6320-cvtres.read.1.tlog&&............\............\.....\link.6320-cvtres.write.1.tlog&&............\............\.....\link.6320.read.1.tlog&&............\............\.....\link.6320.write.1.tlog&&............\............\.....\link.8044-cvtres.read.1.tlog&&............\............\.....\link.8044-cvtres.write.1.tlog&&............\............\.....\link.8044.read.1.tlog&&............\............\.....\link.8044.write.1.tlog&&............\............\.....\link.read.1.tlog&&............\............\.....\link.write.1.tlog&&............\............\.....\mt.read.1.tlog&&............\............\.....\mt.write.1.tlog&&............\............\.....\panel.obj&&............\............\.....\processBasic.Build.CppClean.log&&............\............\.....\processBasic.exe.embed.manifest&&............\............\.....\processBasic.exe.embed.manifest.res&&............\............\.....\processBasic.exe.intermediate.manifest&&............\............\.....\processBasic.lastbuildstate&&............\............\.....\processBasic.log&&............\............\.....\processBasic.obj&&............\............\.....\processBasic.pch&&............\............\.....\processBasic.res&&............\............\.....\processBasicDlg.obj&&............\............\.....\processBasic_manifest.rc&&............\............\.....\rc.read.1.tlog&&............\............\.....\rc.write.1.tlog&&............\............\.....\stdafx.obj&&............\............\.....\threadFunc.obj&&............\............\.....\vc100.idb&&............\............\.....\vc100.pdb&&............\............\main.cpp&&............\............\panel.cpp&&............\............\panel.h&&............\............\processBasic.aps&&............\............\processBasic.cpp&&............\............\processBasic.h&&............\............\processBasic.rc&&............\............\processBasic.vcxproj&&............\............\processBasic.vcxproj.filters&&............\............\processBasic.vcxproj.user&&............\............\processBasicDlg.cpp&&............\............\processBasicDlg.h&&............\............\producer.h&&............\............\ReadMe.txt&&............\............\res\processBasic.ico&&............\............\...\processBasic.rc2&&............\............\resource.h&&............\............\stdafx.cpp&&............\............\stdafx.h&&............\............\targetver.h&&............\............\threadFunc.cpp&&............\processBasic.sdf&&............\processBasic.sln&&............\processBasic.suo&&............\ipch\processbasic-863d64b0&&............\processBasic\Debug&&............\............\res&&............\Debug&&............\ipch&&............\processBasic&&processBasic&&生产者消费者问题.docx
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 通过此程序,可以看到两个线程可以同时工作,实现两个线程同时进行
&[] - C++语言实现生产者消费者问题
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。
&[] - 用多线程实现“生产者-消费者问题”本作业要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。你需要使用如下信号量:一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;一个信号量,当生产者线程生产出一个物
&[] - 对生产者消费者问题要能实现动态的设置缓冲池大小,最好做出界面效果,实现动态的生产和消费过程。文档分类:
在线文档经过高度压缩,下载原文更清晰。
淘豆网网友近日为您收集整理了关于实验报告五 生产者和消费者问题(精选)的文档,希望对您的工作和学习有所帮助。以下是文档介绍:实验报告五 生产者和消费者问题(精选) 实验报告五——生产者和消费者问题姓名:丛菲学号: 班级:信息安全二班一、实习内容 1、模拟操作系统中进程同步和互斥 2、实现生产者和消费者问题的算法实现二、实习目的 1、熟悉临界资源、信号量及 PV 操作的定义与物理意义 2、了解进程通信的方法 3、掌握进程互斥与进程同步的相关知识 4、掌握用信号量机制解决进程之间的同步与互斥问题 5、实现生产者-消费者问题,深刻理解进程同步问题三、实习题目在 Linux 操作系统下用 C 实现经典同步问题:生产者—消费者,具体要求如下:(1)一个大小为 10 的缓冲区,初始状态为空。(2)2 个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复 10 次。(3)2 个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生产者添加数据之后再读取,重复 10 次。提示本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的相互制约有两种不同的方式。(1)间接(来源:淘豆网[/p-.html])制约。这是由于多个进程共享同一资源(如 CPU、共享输入/输出设备)而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。(2)直接制约。只是由于进程合作中各个进程为完成同一任务而造成的,即并发进程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。在本实验中,进程之间要进行通信来操作同一缓冲区。一般来说,进程间的通信根据通信内容可以划分为两种:即控制信息的传送与大批量数据传送。有时,也把进程间控制在本实验中,进程之间要进行通信来操作同一缓冲区。一般来说,进程间的(来源:淘豆网[/p-.html])通信根据通信内容可以划分为两种:即控制信息的传送与大批量数据传送。有时,也把进程间控制信息的交换称为低级通信,而把进程间大批量数据的交换称为高级通信。目前,计算机系统中用得比较普遍的高级通信机制可分为 3 大类:共享存储器系统、消息传递系统及管道通信系统。共享存储器系统共享存储器系统为了传送大量数据,在存储器中划出一块共享存储区,诸进程可通过对共享存储区进行读数据或写数据以实现通信。进程在通信之前,向系统申请共享存储区中的一个分区,并为它指定一个分区关键字。信息的交换称为低级通信,而把进程间大批量数据的交换称为高级通信。目前,计算机系统中用得比较普遍的高级通信机制可分为 3 大类:共享存储器系统、消息传递系统及管道通信系统。消息传递系统在消息传递系统中,进程间的数据交换以消息为单位,在计算机网络中被称为报文。消息传递系统的实现方式又可以分为以下两种:(1)直接通信方式发送进程可将消息直接发送给接收进程,即将消息挂在接收进程的消息缓冲队列上,而接收进程可从自己的消息缓冲队列中取得消息。(2)间(来源:淘豆网[/p-.html])接通信方式发送进程将消息发送到指定的信箱中,而接收进程从信箱中取得消息。这种通信方式又称信箱通信方式,被广泛地应用于计算机网络中。相应地,该消息传递系统被称为电子邮件系统。管道通信系统向管道提供输入的发送进程,以字符流方式将大量的数据送入管道,而接收进程从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故称为管道通信。为了协调发送和接收双方的通信,管道通信机制必须提供以下 3 方面的协调功能。(1)互斥当一个进程正在对 pipe 文件进行读或写操作时,另一个进程必须等待。(2)同步当写进程把一定数量的数据写入 pipe 文件后,便阻塞等待,直到读进程取走数据后,再把写进程唤醒。(3)确认对方是否存在只有确定对方已存在时,才能进行管道通信,否则会造成因对方不存在而无限制地等待。在这个问题当中,我们采用信号量机制进行进程之间的通信,设置两个信号量,空的信号量和满的信号量。在 Linux 系统中,一个或多个信号量构成一个信号量集合。使用信号量机制可以实现进程之间的同步和互斥,允许并发进(来源:淘豆网[/p-.html])程一次对一组信号量进行相同或不同的操作。每个 P、V 操作不限于减 1 或加 1,而是可以加减任何整数。在进程终止时,系统可根据需要自动消除所有被进程操作过的信号量的影响1.缓冲区采用循环队列表示,利用头、尾指针来存放、读取数据,以及判断队列是否为空。缓冲区中数组大小为 10;2.利用随机函数 rand()得到 A~Z 的一个随机字符,作为生产者每次生产的数据,存放到缓冲区中;3. 使用 shmget()系统调用实现共享主存段的创建, shmget()返回共享内存区的 ID。对于已经申请到的共享段,进程需把它附加到自己的虚拟空间中才能对其进行读写。4.信号量的建立采用 semget()函数,同时建立信号量的数量。在信号量建立后,调用 semctl()对信号量进行初始化,例如本实习中,可以建立两个信号量 SEM_EMPTY、SEM_FULL,初始化时设置 SEM_EMPTY 为 10,SEM_FULL 为 0。使用操作信号的函数 semop()做排除式操作,使用这个函数防止对共享内存的同时操作(来源:淘豆网[/p-.html])。对共享内存操作完毕后采用 shmctl()函数撤销共享内存段。5.使用循环,创建 2 个生产者以及 2 个消费者,采用函数 fork()创建一个新的进程。6.一个进程的一次操作完成后,采用函数 fflush()刷新缓冲区。7.程序最后使用 semctl()函数释放内存。模拟程序的程序流程图如下所示:1.主程序流程图:2.生产者进程流程图3.消费者进程流程图4.P 操作流程图5.V 操作流程图四、实现代码为:// exet5.cpp//#include &stdafx.h&#include &stdio.h&#include &stdlib.h&#define mSIZE 3#define pSIZE 20staticintmemery[mSIZE] = {0};staticint process[pSIZE] = {0};//static int process[pSIZE] = {2,3,2,1,5,2,4,5,3,2,5,2};//stati(来源:淘豆网[/p-.html])c int process[pSIZE] ={7,10,1,2,10,3,10,4,2,3,10,3,2,1,2,10,1,7,10,1};void build();void LRU();int main(intargc, char *argv[]){printf(&Random sequence is as follows:\n&);build();printf(&\nInvoking LRU Algorithn: \n&);LRU();return 0;}void build(){inti = 0;for(i=0; i&pSIZE; i++){process[i] = (int)(10.0*rand()/(RAND_MAX));printf(&%d &,process[i]);}printf(&\n&);}void LRU(){int flag[mSIZE] = {0};inti = 0, j = 0;(来源:淘豆网[/p-.html])int m = -1, n = -1;int max = -1,maxflag = 0;int count = 0;for(i = 0; i&pSIZE; i++){//Find the first free Physical Blockfor(j=0; j&mSIZE; j++){if(memery[j] == 0){m =}}//Find if there are same processesfor(j = 0; j &mSIZE; j++){if(memery[j] == process[i]){n =}}//Find free PBfor(j = 0; j &mSIZE;j++){if(flag[j]&maxflag){maxflag = flag[j];max =}}if(n == -1) // Find no same process{if(m != -1) // find free PB{memery[m] = pro(来源:淘豆网[/p-.html])cess[i];flag[m] = 0;for(j = 0;j &= j++){flag[j]++;}m = -1;}else //NO find free PB{memery[max] = process[i];flag[max] = 0;for(j = 0;j &mSIZE; j++){flag[j]++;}max = -1;maxflag = 0;count++;}}else // Find same process{memery[n] = process[i];flag[n] = 0;if(m != -1) //find free PB{flag[m] = 0;}for(j = 0;j &mSIZE; j++){flag[j]++;}max = -1;maxflag = 0;n = -1;}for(j = 0 ;j &mSIZE; j++){printf(&%d &,memery[j]);}printf(&\n&)(来源:淘豆网[/p-.html]);}printf(&\nThe times of page conversion is:%d\n&,count);}五、在虚拟机上的具体操作及结果执行 exe5.c 文件选择 ApplicationsAcecessoriesTerminal,执行文件:依次预处理编译汇编连接执行用文件,编译通过之后-o 执行。报错!!!!错误显示为很多头文件没有预定义。连续查找之后得知原因是链接不上 pthread库在执行命令后面加上-pthread,即新命令格式为:gcc -oexe5exe5.c–lpthread,重新执行后的结果显示如下截图:其中 1 表示缓冲区被生产者 producer1 或者二 producer2 写入了 Item,0 表示没有写入数据或者被消费者 consumer1 或者 consumer2 消耗掉六、实验总结及思考1、本次实验是关于生产者与消费者之间互斥和同步的问题。问题的是指是 P、V 操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。2、实验中包含的知识点很多,包括临界区资源共享问题、信号量定义、PV操作流程、进程间的通信方式(消息传递和共享内存)、进程同步和互斥、信号量机制解决进程之间的同步与互斥问题等等。加深了对于本部分内容的理解通过本实验设计,我们对操作系统的 P、V 进一步的认识,深入的了解 P、V 操作的实质和其重要性。课本的理论知识进一步阐述了现实中的实际问题。播放器加载中,请稍候...
该用户其他文档
下载所得到的文件列表实验报告五 生产者和消费者问题(精选).doc
文档介绍:
实验报告五 生产者和消费者问题(精选) 实验报告五——生产者和消费者问题姓名:丛菲学号: 班级:信息安全二班一、实习内容 1、模拟操作系统中进程同步和互斥 2、实现生产者和消费者问题的算法实现二、实习目的 1、熟悉临界资源、信号量及 PV 操作的定义与物理意义 2、了解进程通信的方法 3、掌握进程互斥与进程同...
内容来自淘豆网转载请标明出处.新手求大神指教,生产者消费者问题++++++++++++++++++++++++++++_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:298,549贴子:
新手求大神指教,生产者消费者问题++++++++++++++++++++++++++++收藏
public static void main(String[] args){Cake c = new Cake();Producer p1 = new Producer(c);Consumer c1 = new Consumer(c);Thread t1 = new Thread(p1);Thread t2 = new Thread(p1);Thread t3 = new Thread(c1);Thread t4 = new Thread(c1);t1.start();t2.start();t3.start();t4.start();}和public static void main(String[] args){Cake c = new Cake();Producer p1 = new Producer(c);Producer p2 = new Producer(c);Consumer c1 = new Consumer(c);Consumer c2 = new Consumer(c);Thread t1 = new Thread(p1);Thread t2 = new Thread(p2);Thread t3 = new Thread(c1);Thread t4 = new Thread(c2);t1.start();t2.start();t3.start();t4.start();}为什么结果不一样?????????????????????????????????
你创建了不同的对象当然结果不一样了。。。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或多线程程序一段问题代码分析(生产者消费者) - 开涛的博客 - ITeye技术网站
问题在《》,解答一下,只解释原因,其他不考虑。
作者要的是一个生产者生成,接着必须有一个消费者消费,那这不是需要单线程吗?或者使用1个大小的阻塞队列。所以只谈论问题本身,不谈论好不好。
具体代码:
import java.util.concurrent.locks.C
import java.util.concurrent.locks.L
import java.util.concurrent.locks.ReentrantL
//生产/消费者模式
public class Basket {
Lock lock = new ReentrantLock();
// 产生Condition对象
Condition produced = lock.newCondition();
Condition consumed = lock.newCondition();
boolean available =
public void produce() throws InterruptedException {
lock.lock();
if (available) {
produced.await(); // 放弃lock进入睡眠
System.out.println("Apple produced.");
available =
consumed.signal(); // 发信号唤醒等待这个Condition的线程
} finally {
lock.unlock();
public void consume() throws InterruptedException {
lock.lock();
if (!available) {
consumed.await(); // 放弃lock进入睡眠
/* 吃苹果 */
System.out.println("Apple consumed.");
available =
produced.signal(); // 发信号唤醒等待这个Condition的线程
} finally {
lock.unlock();
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
//测试用类
public class ConditionTester {
public static void main(String[] args) throws InterruptedException {
final Basket basket = new Basket();
// 定义一个producer
Runnable producer = new Runnable() {
public void run() {
basket.produce();
} catch (InterruptedException ex) {
ex.printStackTrace();
// 定义一个consumer
Runnable consumer = new Runnable() {
public void run() {
basket.consume();
} catch (InterruptedException ex) {
ex.printStackTrace();
// 各产生10个consumer和producer
ExecutorService service = Executors.newCachedThreadPool();
for (int i = 0; i & 4; i++)
service.submit(consumer);
Thread.sleep(2000 * 2);
for (int i = 0; i & 4; i++)
service.submit(producer);
service.shutdown();
原因分析:
1、假设前面有2个producer(此时available=true)
1.1、一个在等待lock
1.2、一个await
2、consumer生成内容后,available=false,produced.signal(); 最后lock.unlock();
3.1、因为lock.unlock所以会触发一个lock获取到锁(虽然signal也会触发等待这个条件的其他线程,但是多线程大家都知道什么时候触发这是不确定的),如果此时正好是[1.1]那么因为available=false,执行完释放锁
3.2、produced.signal()所以会触发一个await的producer;
解决方案:
只要保证[3.1]还是需要await即可解决问题
所以加一个 AtomicInteger producedAwaitCounter = new AtomicInteger(0); 统计当前等待的生产者,如果当前available=false,但已经有生产者生成了内容,那么先等待消费者消费了再说
if (available || producedAwaitCounter.get() & 0) {
producedAwaitCounter.incrementAndGet();
produced.await(); // 放弃lock进入睡眠
producedAwaitCounter.decrementAndGet();
当然最简单的是使用:自旋,原理可以自己分析下:
while (available) {
produced.await(); // 放弃lock进入睡眠
package com.sishuok.es.
import java.util.concurrent.atomic.AtomicI
import java.util.concurrent.locks.C
import java.util.concurrent.locks.L
import java.util.concurrent.locks.ReentrantL
//生产/消费者模式
public class Basket {
Lock lock = new ReentrantLock(true);
// 产生Condition对象
Condition produced = lock.newCondition();
Condition consumed = lock.newCondition();
boolean available =
AtomicInteger producedAwaitCounter = new AtomicInteger(0);
public void produce() throws InterruptedException {
lock.lock();
if (available || producedAwaitCounter.get() & 0) {
producedAwaitCounter.incrementAndGet();
produced.await(); // 放弃lock进入睡眠
producedAwaitCounter.decrementAndGet();
System.out.println("Apple produced.");
available =
consumed.signal(); // 发信号唤醒等待这个Condition的线程
} finally {
lock.unlock();
public void consume() throws InterruptedException {
lock.lock();
if (!available) {
consumed.await(); // 放弃lock进入睡眠
/* 吃苹果 */
System.out.println("Apple consumed.");
available =
produced.signal(); // 发信号唤醒等待这个Condition的线程
} finally {
lock.unlock();
在回答里还一个类似的,不过还是不太一样。
写道jinnianshilongnian 写道 写道teasp 写道 写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!李国刚,人物名。知名人物主要有洛阳市副市长,财经作家、联想管理模式研究专家等。 jinnianshilongnian 写道 写道teasp 写道 写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!李国刚,人物名。知名人物主要有洛阳市副市长,财经作家、联想管理模式研究专家等。 开涛人气旺呀!帖子都上到首页了第一位了。给我的那篇博客都带去几十个人。牛x!哈哈,来iteye开博客啊,一起进步好,把博客移到iteye上来,多多指导!
jinnianshilongnian 写道 写道teasp 写道 写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!李国刚,人物名。知名人物主要有洛阳市副市长,财经作家、联想管理模式研究专家等。 jinnianshilongnian 写道 写道teasp 写道 写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!李国刚,人物名。知名人物主要有洛阳市副市长,财经作家、联想管理模式研究专家等。 开涛人气旺呀!帖子都上到首页了第一位了。给我的那篇博客都带去几十个人。牛x!哈哈,来iteye开博客啊,一起进步
写道teasp 写道 写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!李国刚,人物名。知名人物主要有洛阳市副市长,财经作家、联想管理模式研究专家等。 jinnianshilongnian 写道 写道teasp 写道 写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!李国刚,人物名。知名人物主要有洛阳市副市长,财经作家、联想管理模式研究专家等。 开涛人气旺呀!帖子都上到首页了第一位了。给我的那篇博客都带去几十个人。牛x!
写道teasp 写道 写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!李国刚,人物名。知名人物主要有洛阳市副市长,财经作家、联想管理模式研究专家等。 我是最不知名那个,哈哈!
teasp 写道 写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!李国刚,人物名。知名人物主要有洛阳市副市长,财经作家、联想管理模式研究专家等。
写道teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下! 你是liguogang?嗯!
teasp 写道对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。
正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下!
你是liguogang?
对于卡死的说法,我得更正下,这是我分析错了,虽然两个producer会同时进入到await状态,但是consumer会将其中的一个唤醒。因此不会卡死。正解,呵呵!这个程序光用看确实很容易犯错。特别还是看别人的代码!以后多一起讨论下!
可能是我表述不达意!我说的和你这个情况是一样的,只是解决方案略有不同!是的。问题是出于一种情况。
teasp 写道也没有完全解决卡死的问题。必须要有两个counter呀,producer一个,consumer也要一个的。
很希望听详解,具体分析下。
跟你在producer上加counter是一样的道理呀。
teasp 写道虽然consumer或者producer signal另外的线程之后,没法保证下一个获取锁的到底是consumer还是producer,但是available变量可以保证如果下一个获取锁的跟signal的那个是同样类型的(都是producer或者consumer),那么它会进入wait状态。
问题就处在available,如果是unlock后又一个lock的producer获取了,因为available=false,所以不会await,但是await的producer 已经判断过了,所以不会有问题;其实可以参考第二篇帖子;但是不一样的是此处不能再简单的if,否则不会进行System.out,造成一次丢失生产者生产的数据
在await后,需要while 判断下available也能搞定。即自旋判断available直到其真正的获取到条件。
即最简单的是使用:
&&&&&&&&&&& while (available) {
&&&&&&&&&&&&&&& produced.await(); // 放弃lock进入睡眠
&&&&&&&&&&& }
你的说法有道理。
也没有完全解决卡死的问题。必须要有两个counter呀,producer一个,consumer也要一个的。很希望听详解,具体分析下。
虽然consumer或者producer signal另外的线程之后,没法保证下一个获取锁的到底是consumer还是producer,但是available变量可以保证如果下一个获取锁的跟signal的那个是同样类型的(都是producer或者consumer),那么它会进入wait状态。问题就处在available,如果是unlock后又一个lock的producer获取了,因为available=false,所以不会await,但是await的producer 已经判断过了,所以不会有问题;其实可以参考第二篇帖子;但是不一样的是此处不能再简单的if,否则不会进行System.out,造成一次丢失生产者生产的数据在await后,需要while 判断下available也能搞定。即自旋判断available直到其真正的获取到条件。即最简单的是使用:&&&&&&&&&&& while (available) {&&&&&&&&&&&&&&& produced.await(); // 放弃lock进入睡眠&&&&&&&&&&& }
& 上一页 1
jinnianshilongnian
浏览: 5466276 次
浏览量:932968
浏览量:968626
浏览量:1744177
浏览量:109717
浏览量:413436
浏览量:124085
浏览量:778434
浏览量:71504
zqb666kkk 写道zqb666kkk 写道xiaozhi ...
zqb666kkk 写道xiaozhi7616 写道world ...
xiaozhi7616 写道worldfather168 写道 ...
java.lang.NullPointerException

我要回帖

更多关于 生产者 消费者 模型 的文章

 

随机推荐