考虑有三个吸烟者进程和一个经销商进程的系统中,每个吸烟者连续不断地制作烟卷并将其做好的烟卷消费掉(即吸烟)。制烟和吸烟过程需要烟草、烟纸和火柴三种原料。这三个吸烟者自己分别掌握有烟草、烟纸和火柴中的一种。经销商能源源不断地提供上述三种原料,每次经销商会提供

admin2013-12-31  28

问题 考虑有三个吸烟者进程和一个经销商进程的系统中,每个吸烟者连续不断地制作烟卷并将其做好的烟卷消费掉(即吸烟)。制烟和吸烟过程需要烟草、烟纸和火柴三种原料。这三个吸烟者自己分别掌握有烟草、烟纸和火柴中的一种。经销商能源源不断地提供上述三种原料,每次经销商会提供上述三种原料中的任意两种,当某个吸烟者发现经销商提供的原料恰好是自己所需的时候,该吸烟者会取走那两种原料,与他自己拥有的原料一起,开始制烟和吸烟。经销商发现原料被取走了就会继续提供任意两种原料,如此反复。试设计一个使经销商和吸烟者同步的算法,并用C语言编写程序。

选项

答案semaphore Stp=0; //烟草和纸的组合信号量 semaphore Spm:0; //烟纸和火柴的组合信号量 semaphore Stm=0; //烟草和火柴的组合信号量 semaphore buffer=1; //经销商用于放置原料的缓冲区信号量 main() //主程序开始 cobegin{ //并发进程示意(不要遗忘) smokert(void) //第一个拥有烟草的吸烟者的进程 while(true){ //进程被调度 P(Spm); //有烟纸和火柴吗 fatch_paper_match(); //取烟纸和火柴 V(buffer); //缓冲区可以用了 make_smoke();} //制烟和吸烟 smokerp(void) //第二个拥有烟纸的吸烟者的进程 while(true)( //进程被调度 P(Stm); //有烟草和火柴吗 fatch_tobacco_match(); //取烟草和火柴 V(buffer); //缓冲区可以用了 make_smoke();} //制烟和吸烟 smokerm(void) //第三个拥有火柴的吸烟者的进程 while(true){ //进程被调度 P(Stp); //有烟草和烟纸吗 fatch tobacco_paper(); //取烟草和烟纸 V(buffer); //缓冲区可以用了 make_smoke();} //制烟和吸烟 agency(void) //经销商供货的进程 while(true){ //进程被调度 int item; //局部变量,用于供货时货物识别 P(buffer); //缓冲区空闲吗 item:put_material(); //放置原料,item为其标识 if(item==p_m) //如果放置的是烟纸和火柴两种原料 V(Spm); //置烟纸和火柴的组合信号量 else //然而 if(item==t_m) //如果放置的是烟草和火柴两种原料 V(Stm); //置烟草和火柴的组合信号量 else //然而 V(Stp); //置烟草和烟纸的组合信号量

解析
转载请注明原文地址:https://kaotiyun.com/show/CSxi777K
0

最新回复(0)