进程同步机制与互斥-生产者消费者问题

合集下载

实验、进程的同步与互斥——生产者消费者

实验、进程的同步与互斥——生产者消费者

实验、进程的同步与互斥——⽣产者消费者1. 1. 实验⽬的两个或两个以上的进程,不能同时进⼊关于同⼀组共享变量的临界区域,否则可能发⽣与时间有关的错误,这种现象被称作进程互斥。

对CPU的速度和数⽬不做出任何假设的前提下,并发进程互斥访问临界资源,是⼀个较好的解决⽅案。

另外,还需要解决异步环境下的进程同步问题。

所谓异步环境是指:相互合作的⼀组并发进程,其中每⼀个进程都以各⾃独⽴的、不可预知的速度向前推进;但它们⼜需要密切合作,以实现⼀个共同的任务,即彼此“知道”相互的存在和作⽤。

实验⽬的:分析进程争⽤资源的现象,学习解决进程同步与互斥的⽅法。

本实验属于设计型实验,实验者可根据⾃⾝情况选⽤合适的开发环境和程序架构。

1. 2. 实验原理信号量的PV操作与处理相关,P表⽰通过的意思,V表⽰释放的意思。

1962年,狄克斯特拉离开数学中⼼进⼊位于荷兰南部的艾恩德霍芬技术⼤学(Eindhoven Technical University)任数学教授。

在这⾥,他参加了X8计算机的开发,设计与实现了具有多道程序运⾏能⼒的操作系统——THE Multiprogramming System。

THE是艾恩德霍芬技术⼤学的荷兰⽂Tchnische Hoogeschool Eindhov –en的词头缩写。

狄克斯特拉在THE这个系统中所提出的⼀系统⽅法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构,顺序进程之间的同步和互斥机制这样⼀些重要的思想和概念都是狄克斯特拉在THE中⾸先提出并为以后的操作系统如UNIX等所采⽤的。

为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为“就绪”(ready)、“运⾏”(running)和“阻塞”(blocking)三个⼯作状态。

由于在任⼀时刻最多只有⼀个进程可以使⽤处理机,正占⽤着处理机的进程称为“运⾏”进程。

当某进程已具备了使⽤处理机的条件,⽽当前⼜没有处理机供其使⽤,则使该进程处于“就绪”状态。

进程管理----生产者和消费者问题(实验报告)

进程管理----生产者和消费者问题(实验报告)

计算机与信息工程系实验报告班级计算机1001班姓名李双贺时间2011年10月19日地点文理楼A504实验名称进程管理----生产者和消费者问题实验目的:(1)加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质。

(3)验证用信号量机制实现进程互斥的方法。

(4)验证用信号机制实现进程同步的方法。

实验内容问题描述:考虑有一些生产者和消费者进程,生产者进程生产信息并把它们放入缓冲池中,消费者从缓冲池中取走信息。

生产者—消费者问题是相互合作的进程关系的一种抽象,如在输入时,输入进程是生产者,计算进程是消费者;而在输出时,则计算进程是生产者,打印进程是消费者。

请使用信号量机制来解决生产者—消费者问题。

互斥关系:(I)设缓冲池有n个单元。

(II)当n个单元装满时,生产者必须等待。

(III)当缓冲池空时,消费者必须等待。

参考算法://创建生产者线程for (int i=0;i<PRODUCERS_COUNT;++i){hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if (hThreads[i]==NULL) return -1;}//创建消费者线程for ( i=0;i<CONSUMERS_COUNT;++i){hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]); if (hThreads[i]==NULL) return -1;}while(g_continue){if(getchar()){ //按回车后终止程序运行g_continue = false;}}缓冲区return 0;}//生产者DWORD WINAPI Producer(LPVOID lpPara){while(g_continue){WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);}return 0;}//消费者DWORD WINAPI Consumer(LPVOID lpPara){while(g_continue){WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE);Take();Consume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL);}return 0;}实验结果。

详解进程同步与互斥机制

详解进程同步与互斥机制

详解进程同步与互斥机制⽬录⼀、什么是进程同步⼆、什么是进程互斥三、常见的进程同步与互斥机制⼀、什么是进程同步在多道批处理系统中,多个进程是可以并发执⾏的,但由于系统的资源有限,进程的执⾏不是⼀贯到底的,⽽是⾛⾛停停,以不可预知的速度向前推进,这就是进程的异步性。

那么,进程的异步性会带来什么问题呢?举个例⼦,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。

那么写数据应该发⽣在读数据之前。

⽽实际上,由于异步性的存在,可能会发⽣先读后写的情况,⽽此时由于缓冲区还没有被写⼊数据,读进程 A 没有数据可读,因此读进程 A 被阻塞。

进程同步(synchronization)就是⽤来解决这个问题的。

从上⾯的例⼦我们能看出,⼀个进程的执⾏可能影响到另⼀个进程的执⾏,所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执⾏次序、传递信号或消息。

再举个⽣活中的进程同步的例⼦,你想要喝热⽔,于是你打了⼀壶⽔开始烧,在这壶⽔烧开之前,你只能⼀直等着,⽔烧开之后⽔壶⾃然会发⽣响声提醒你来喝⽔,于是你就可以喝⽔了。

就是说⽔烧开这个事情必须发⽣在你喝⽔之前。

注意不要把进程同步和进程调度搞混了:进程调度是为了最⼤程度的利⽤ CPU 资源,选⽤合适的算法调度就绪队列中的进程。

进程同步是为了协调⼀些进程以完成某个任务,⽐如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执⾏次序使得某个任务能够顺利完成。

⼆、什么是进程互斥同样的,也是因为进程的并发性,并发执⾏的线程不可避免地需要共享⼀些系统资源,⽐如内存、打印机、摄像头等。

举个例⼦:我们去学校打印店打印论⽂,你按下了 WPS 的 “打印” 选项,于是打印机开始⼯作。

你的论⽂打印到⼀半时,另⼀位同学按下了 Word 的 “打印” 按钮,开始打印他⾃⼰的论⽂。

想象⼀下如果两个进程可以随意的、并发的共享打印机资源,会发⽣什么情况?显然,两个进程并发运⾏,导致打印机设备交替的收到 WPS 和 Word 两个进程发来的打印请求,结果两篇论⽂的内容混杂在⼀起了。

进程同步问题分析——生产者和消费者问题

进程同步问题分析——生产者和消费者问题

一、讨论课名称:计算机操作系统中进程同步与互斥问题分析二、讨论课目的:1.熟悉临界资源、信号量及PV操作的定义与物理意义;2.掌握进程互斥与进程同步的相关知识;3.掌握用信号量机制解决进程之间的同步与互斥问题;4.实现生产者-消费者问题,深刻理解进程同步问题。

三、讨论课内容:1.进程同步的基本概念在多道程序环境下,系统中可能存在许多的进程,在这些进程之间必定存在一些制约关系,这种制约关系表现为以下两种形式:①资源共享关系。

进程之间不知道其他进程的存在,而这些进程又处在同一个系统中,对系统资源必须共享使用,而有些资源不允许进程同时访问,例如打印机。

系统只能保证进程间互斥地使用这种临界资源,称这种资源共享关系叫做互斥;②相互合作关系。

在某些进程间还存在一种相互合作的关系。

例如在某个系统中存在两个进程,输入进程A和计算进程B,A负责向B提供数据,当缓冲区空时,B进程因不能获得所需数据而等待。

当A把数据送入缓冲区后,并向B发送一个信号将B唤醒,B才能取走数据。

同样,当B没有提取数据,也就是说缓冲区满时,进程A也无法向其中投入数据而等待。

这就是一种相互合作关系,称之为进程间的同步关系。

2.信号量机制实现进程同步本文分析的生产者-消费者问题就是一种相互合作问题的代表,对进程同步问题的解决,早在1965年,荷兰科学家Dijkstra就提出信号量机制是一种卓有成效的进程同步工具。

在信号量机制中,信号量仅能通过两个标准的原子操作wait(s)和singnal(s)来访问。

这两个操作被称为P,V操作。

在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接上述的所有等待进程。

记录型信号量是由于它采用了记录型的数据结构而得名的。

它所包含的上述两个数据项可描述为:type semaphore=recordvalue:integer;L:list of process;End相应地,wait(s)和singal(s)操作可描述为:Procedure wait(s)var s:semaphore;BeginS.value:=S.value-1;If S.value<0 then block(S,L)EndProcedure signal(s)var S:semaphore;BeginS.value:=S.value+1;If S.value<=0 then wakeup(S,L);End每次的wait操作,意味着进程请求一个单位的资源,因此描述为S.value:=S.value-1;当S.value<0时,表示资源已分配完毕,因而进程调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。

进程同步中的生产者--消费者模型分析

进程同步中的生产者--消费者模型分析
11问囊描述 .

个仓库用 于临时性存放 物品。生产者不断地进行 生产 ,每生产 出一件产品 ,就将该产品放 入仓库 ,仓库
放满后则暂停生产 。消费者不 断地从仓库 中取出一件物 品 ,然后进行消费 ,仓库取空后则 暂停消 费。
12 模 型 分 析 .
可以将仓库抽象 为计算机 内存 中的缓 冲区 ,生产者和消费者抽象为不同的并发进程 。在现代操作系统 中,
2 单缓冲 区的单生产者一 单消费者问题模型

限制条件 :整个 系统仅有唯一的一个缓 冲区 ,活动进程仅有 一个生产者 Po u e 和一个消费者 C nu r rd cr o sme。
2 1 进 程 关 系 分析 .
同步关 系 : 1 只有在 Po ue 向缓冲区放人物品后 , o s m r ( ) rd cr C nu e 才能够从缓冲 区中取出物品消费 ; 因此存 在 C nu r 于 Po u e 的同步依赖 。( )只有在 C nu r o sme 对 rd cr 2 o sme 从缓 冲区取 出物品后 ,Po u e 才能够继续向 rd cr 缓冲区中放入新生产 的物品 ;因此存在 P o u e 对于 C nu r rd c r o sme 的同步依赖 。 互斥关 系:( ) rd c r 1 P o u e 放人物 品的同时 ,C nu r o sme 是不 能从缓 冲区中取 出物 品的;反之亦然 。因此存 在
维普资讯
第2卷 第4 0 期 20 0 7年 4月
武 汉 科 技 学 院 学 报
J oURNAL OF UHAN W UNI VERS TY CI I OF S ENCE AND ENGI NEERI NG
V 1 0No4 b . . 2

进程的同步与互斥之生产者消费者问题:对信号量设置的理解及PV操作顺序分析

进程的同步与互斥之生产者消费者问题:对信号量设置的理解及PV操作顺序分析

进程的同步与互斥之⽣产者消费者问题:对信号量设置的理解及PV操作顺序分析问题描述系统中有⼀组⽣产者进程和⼀组消费者进程,⽣产者进程每次⽣产⼀个产品放⼊缓冲区,消费者进程每次从缓冲区取出⼀个产品并使⽤;缓冲区在同⼀时刻只能允许⼀个进程访问。

问题分析⽣产者、消费者共享⼀个初始为空、⼤⼩为n的缓冲区,我们把缓冲区中未存放数据的⼀个块,当作⼀个“空位”;把其中按块存放的数据当作“产品”。

同步关系:⽣产者与消费者只有缓冲区有空位时,⽣产者才能把产品放⼊缓冲区⽣产者把“空位”当作资源,缓冲区初始为空,即空位数量为n(n:空的缓冲区⼤⼩)所以可以设置信号量empty,初始nempty>0时,有空位,⽣产者可以消耗“空位”这种资源即P(empty);empty<=0时,⽣产者⽆“空位”资源可⽤,便会挂起到阻塞队列等待。

只有缓冲区有产品时,消费者才能从缓冲区中取出产品消费者把“产品”当作资源,缓冲区初始为空,即产品数量为0所以可以设置信号量full,初始为0full<=0,消费者⽆“产品”这种资源可⽤,便会挂起到阻塞队列full>0,有产品,消费者可以消耗“产品”这种资源即P(full)进⼀步:empty>0时,有空位,⽣产者可以消耗“空位”这种资源即P(empty)的同时:⽣产了“产品这种资源”,即V(full);full>0时,有产品,消费者可以消耗“产品”这种资源即P(full)的同时:⽣产了“空位”这种资源,即V(empty);互斥关系:所有进程之间缓冲区是临界资源,各个进程必须互斥地访问设置信号零mutex,初始为1在进⼊区P(mutex)申请资源在退出区V(mutex)释放资源设计typedef struct{int value;Struct process *L; //等待序列}semaphore;semaphore full;semaphore empty;semaphore mutex;//某进程需要使⽤资源时,通过wait原语申请:P操作void wait(semaphore S){S.value--;if(S.value < 0){block(S.L);//阻塞原语,将当前进程挂载到当前semaphore的阻塞队列}}//进程使⽤完资源后,通过signal原语释放:V操作void signal(semaphore S){S.value++;if(S.value <= 0){wakeup(S.L);//唤醒原语,将当前semaphore的阻塞队列中的第⼀个进程唤醒}}full.value=0; //缓冲区 “产品”资源数(初始为0),⽤于实现⽣产者与消费者进程的同步empty.value=n; //缓冲区 “空位”资源数(初始为n),⽤于实现⽣产者与消费者进程的同步mutex.value=1; //互斥信号量,⽤于实现所有进程之间互斥地访问缓冲区//⽣产者producer(){while(1){Produce(); //⽣产“产品”P(empty); //“空位”数-1P(mutex); //临界区上锁Storage(); //摆放产品V(mutex); //临界区解锁V(full); //“产品”数+1}}//消费者consumer(){while(1){P(full); //“产品”数-1P(mutex); //临界区上锁TakeOut(); //拿⾛产品V(mutex); //临界区解锁V(empty); //“空位”数+1Use(); //使⽤“产品”}}对于各个操作顺序的理解:1. 对于⼀部分操作的顺序,我们很好理解,符合我们的认知://⽣产者Produce(); //⽣产产品P(empty); //“空位”数-1,可能有⼈在这⾥会问这个操作为什么不可以放在“Storage甚⾄是V(full)”后⾯,考虑⼀种情况:当空位数为0时,我们是不能摆放产品的,⽽这个操作正是在检查是否还有“空位”这种资源;所以它⼀定在Storage前⾯ Storage(); //摆放产品V(full); //“产品”数+1,可能有⼈在这⾥会问这个操作为什么不可以放在“Storage甚⾄是P(empty)”前⾯,考虑⼀种情况:当产品数为n时,我们是不能再摆放产品的,因为缓冲区已满,再向其中添加数据(执⾏Storage)是要出问题的;所 //消费者P(full); //“产品”数-1,同上⾯⼀样,可能有⼈在这⾥会问这个操作为什么不可以放在“TakeOut甚⾄是V(empty)”后⾯,考虑⼀种情况:当产品数为0时,我们是不能拿⾛产品的,⽽这个操作正是在检查是否还有“产品”这种资源;所以它⼀定 TakeOut(); //拿⾛产品V(empty); //“空位”数+1,同上⾯⼀样,可能有⼈在这⾥会问这个操作为什么不可以放在“TakeOut甚⾄是P(full)”前⾯,考虑⼀种情况:当空位数为n时,我们是不能拿⾛产品的,因为缓冲区已经空了,再拿⾛(执⾏TakeOut)拿⾛个寂寞 Use(); //使⽤“产品”2. 对于其他操作:实现同步的P操作⼀定要在实现互斥的P操作之前,为什么呢?反向分析:我们考虑若调换⽣产者上述两个P操作的顺序://⽣产者producer(){while(1){Produce(); //⽣产产品P(mutex); //临界区上锁P(empty); //“空位”数-1Storage(); //摆放产品V(mutex); //临界区解锁V(full); //“产品”数+1}}//消费者consumer(){while(1){P(full); //“产品”数-1P(mutex); //临界区上锁TakeOut(); //拿⾛产品V(mutex); //临界区解锁V(empty); //“空位”数+1Use(); //使⽤“产品”}}若此时缓冲区已经放满产品,则empty=0,full=n⽣产者进程执⾏P(mutex),mutex变为0,由于empty为0即没有“空位”了,需要⽣产者进程阻塞,等待消费者拿⾛产品切换⾄消费者进程,消费者进程执⾏到P(mutex),由于mutex为0即⽣产者未释放临界资源,需要⽣产者释放临界资源,消费者进程阻塞互相等待,进⼊死锁结论:不要让因同步引起的进程阻塞(P操作可能产⽣结果)发⽣在为临界区上锁之后,因为:1. 临界区上锁,表⽰临界资源已被占⽤;若对临界区未解锁之前,发⽣了因同步引起的进程阻塞(上例中即需要⽣产者进程阻塞,等待消费者拿⾛产品)。

操作系统课程设计-进程同步模拟设计

操作系统课程设计-进程同步模拟设计

课程设计题目进程同步模拟设计——生产者和消费者问题学院计算机科学与技术学院专业计算机科学与技术班级0806姓名张方纪指导教师孙玉芬2010 年 1 月20 日课程设计任务书学生姓名:张方纪专业班级:计算机0806指导教师:孙玉芬工作单位:计算机科学与技术学院题目: 进程同步模拟设计——生产者和消费者问题初始条件:1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟用信号量机制实现生产者和消费者问题。

2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——生产者和消费者问题1课设任务本课程设计的任务在于,通过编写一个具体的有关操作系统进程同步互斥的经典问题,加强对操作系统实现进程间同步与互斥的机制的理解。

同时培养提出问题、发现知识、使用工具、解决问题的能力。

具体地,我们要编制出一个程序,利用PV原语以及进程创建、同步、互斥、销毁等相关的系统调用来模拟“生产者—消费者”问题。

2背景介绍2.1“生产者—消费者”问题(the producer-consumerproblem)问题描述:一组生产者向一组消费者提供消息,它们共享一个有界缓冲区n,生产者向其中投放消息,消费者从中取得消息。

生产者与消费者之间的同步与互斥问题

生产者与消费者之间的同步与互斥问题

•进程间的关系 •生产者生产消息 后 消费者消费的合作 关系 •消费者消费 后 的空白缓冲块由生产者 生产消息的合作关系 •进程间在队列操作上的互斥关系
Var mutex, empty, full:semaphore∶=1,n,0; buffer:array[0, …, n-1] of item; in, out: integer∶=0, 0; proceducer:begin repeat producer an item nextp; wait(empty); wait(mutex); buffer(in)∶=nextp; in∶=(in+1) mod n; signal(mutex); signal(full); until false; end • consumer:begin • repeat • wait(full); • wait(mutex); • nextc∶ =buffer(out); • out∶ =(out+1) mod n; • signal(mutex); • signal(empty); • consumer the item in nextc; • until false; • end
互斥问题:
1.生产者与生产者之间、消费者与消费者之间 互斥访问缓冲池。 2.生产者和消费者之间互斥访问缓冲池。
生产者/消费者问题
• 一个生产者,一个消费者,一个缓冲区 • 确定同步对象 • 确定同步约束条件 • 确定同步时机 • 定义信号量:考虑为每个同步对象设一个 信号量 • 用wait()操作判断同步条件是否满足 • 用signal()操作向其它同步对象发同步信号
Thank you !!
姚俊 朱景焕 宋聪 郭涛 欧阳睿 朱思勇 杨凝 熊伟 唐沐 万骞 闫弈潼
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学习中心:
专业:
年级:年春/秋季
学号:
学生:
题目:进程同步与互斥生产者-消费者问题
1.谈谈你对本课程学习过程中的心得体会与建议?
转眼间,学习了一个学期的计算机操作系统课程即将结束。

在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。

在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程
1.1设计思路
在这次设计中定义的多个缓冲区不是环形循环的,并且不需要按序访问。

其中生产者可以把产品放到某一个空缓冲区中,消费者只能消费被指定生产者生产的产品。

本设计在测试用例文件中指定了所有生产和消费的需求,并规定当共享缓冲区的数据满足了所有有关它的消费需求后,此共享才可以作为空闲空间允许新的生产者使用。

本设计在为生产者分配缓冲区时各生产者之间必须互斥,此后各个生产者的具体生产活动可以并发。

而消费者之间只有在对同一个产品进行消费时才需要互斥,它们在消费过程结束时需要判断该消费者对象是否已经消费完毕并释放缓冲区的空间。

1.2程序流程图
1.3基本内容
在设计程序时主要有三个主体部分、三个辅助函数和一个数据结构。

其中主体部分为一个主函数main (),用于初始化缓冲区和各个同步对象,并完成线程信息的读入,最后根据该组的线程记录启动模拟线程,并等待所有线程的运
主函数
初始化缓冲区,消费请求队列及部分同步对象
提取线程信息
完成线程相关同步对象的初始化
等待所有线程结束
创建线程模拟生产和消费
程序结束
消费者
有消费请求?
此请求可满足?
确定产品位置
此产品正被消费?
进入临界区(对同一产品进
行请求的消费者之间互斥)
消费产品、并判断是否应该
释放产品所占缓冲区 结束消费进程
生产者
存在空缓冲区?
另一生产者正在生产?
进入临界区 (所有生产者之间互斥)
从空缓冲区中为本生产者的产品分配一个空间
退出临界区
在该缓冲区放入产品
通过信号量通知等待本产品的消费者
结束生产进程
退出临界区 Y
Y
Y
N
N
N
N
Y
Y
N
行结束后退出程序;
生产者函数Produce()和消费者函数Consume(),生产者和消费者函数运行于线程中完成对缓冲区的读、写动作,根据此处生产消费的模型的特点,生产者和消费者之间通过使用同步对象实现了生产和消费的同步与互斥,是本实验的核心所在。

另外三个辅助性函数被生产者和消费者函数调用,是上述生产和消费函数中对缓冲区进行的一系列处理。

3)在实现本程序的消费生产模型时,具体的通过如下同步对象实现互斥:
①设一个互斥量h_mutex,以实现生产者在查询和保留缓冲区内的下一个位置时进行互斥。

②每一个生产者用一个信号量与其消费者同步,通过设置h_Semaphore[MAX_THREAD_NUM]信号量
③数组实现,该组信号量用于相应的产品已产生。

同时用一个表示空缓冲区
数目的信号量empty_semaphore进行类似的同步,只是缓冲区中是否存在空位置,以便开始生产下一个产品。

④每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,这通过设置临界区对象数组PC_Crilical[MAX_BUFFER_NUM]实现。

1.4程序代码
运行程序如下图主菜单页面所示:
2.2结果分析
由于我们在一个循环中创建了这五个线程,所以认为它们是同时开始运转的。

根据第三列的延迟时间,最早开动作的是thread4生产产品。

它5个缓冲区的位置
[1]中生产了产品。

接下来是线程5和1,消费者5要求消费线程1生产的产品,线
程1还没有生产,所以先阻塞,然后,线程1发送生产请求,线程1生产完产品放入位置[2],消费者5才能够消费,接着消费者5要求消费线程2的产品,此产品还没生产,5线程被阻塞。

到第4秒时,线程2要求生产,产品放入位置[3],消费者3消费线程1的产品.此时线程5所要求消费的产品已经都就绪,所以线程5消费被激活,顺利消费线程1,2,4生产者得产品。

所以,由于对每个产品的都是对它的最后一次消费,所以,消费完产品后随即释放该产品所占缓冲区空间。

相关文档
最新文档