生产者与消费者问题

toann 2004-09-13 03:38:01
mutex:初值为1,控制互斥访问缓冲池;
生产者私用信号量empty:初值为n,表示空缓冲块数目;
消费者私用信号量full:初值为0,表示满缓冲块数目;
整型变量i、j:初值为0,i表示空缓冲块序号头指针,j表示满缓冲块序号头指针

procedure producer //生产者进程 procedure consumer //消费者进程
begin begin
while true do while true do
begin begin
produce next product; P(full);
P(empty); P(mutex);
P(mutex); goods := buffer(j);
buffer(i) := product; j := (j+1) mod n;
i := (i+1) mod n; V(mutex);
V(mutex); V(empty);
V(full); consume product;
end end
end; end;

两进程为并发进程,我的问题是:如果交换两进程中P操作或V操作的次序,会有什么影响?
书上说如果颠倒P操作的次序,会造成死锁。但没有说明原因。

请大虾帮忙看看,能否详细解释一下。万分感谢!!
^_^
...全文
114 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
toann 2004-09-17
  • 打赏
  • 举报
回复
非常感谢大家的回复,这几天因故未能上网,结贴晚了,望见谅:)
Mr-Chen 2004-09-13
  • 打赏
  • 举报
回复
如果调换生产者进程的P操作:

procedure producer //生产者进程 procedure consumer //消费者进程
begin begin
while true do while true do
begin begin
produce next product; P(full);
P(mutex); P(mutex);
P(empty); goods := buffer(j);
buffer(i) := product; j := (j+1) mod n;
i := (i+1) mod n; V(mutex);
V(mutex); V(empty);
V(full); consume product;
end end
end; end;

最简单你可以看看以上情况:
如果生产者一直生产而消费者没有消费,当empty = 0时
此时消费者进程P(full)被执行
接着生产者进程P(mutex)被执行,mutex = 0;
此时生产者进程P(empty)而empty = -1,生产者进程被挂起
而消费者进程P(mutex),mutex = -1,也被挂起
此时就会产生死锁
其它情况类似
shotgun79 2004-09-13
  • 打赏
  • 举报
回复
先申请资源信号量,在申请互斥信号量。因为在申请到资源之前,没有人知道这次申请操作是否能够成功,如果在确定获得资源之前先申请互斥,那么原来正在使用资源的进程就没法操作了,也不能释放自己的资源,你也就得不到资源,接下来就是死锁。

好久没看os了,大概是这个意思吧
DentistryDoctor 2004-09-13
  • 打赏
  • 举报
回复
支之亦然。(将上面的producer与consumer换一下。)
DentistryDoctor 2004-09-13
  • 打赏
  • 举报
回复
是死锁。如果producer等待mutex,而consumer已经得到mutex而等v(full)时就死了,

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧