当前位置: 技术问答>linux和unix
这两个p操作可以互换吗?
来源: 互联网 发布时间:2016-11-10
本文导语: 生产者进程 while(TRUE) { 生产一个产品; P(empty); P(mutex1); 产品送往buffer(in); in=(in+1)mod n; V(mutex1); V(full); } 消费者进程 while(TRUE) { P(full); P(mutex2); 从buffer...
生产者进程
while(TRUE)
{
生产一个产品;
P(empty);
P(mutex1);
产品送往buffer(in);
in=(in+1)mod n;
V(mutex1);
V(full);
}
消费者进程
while(TRUE)
{
P(full);
P(mutex2);
从buffer(out)中取出产品;
out=(out+1)mod n;
V(mutex2);
V(empty);
消费该产品;
}
while(TRUE)
{
生产一个产品;
P(empty);
P(mutex1);
产品送往buffer(in);
in=(in+1)mod n;
V(mutex1);
V(full);
}
消费者进程
while(TRUE)
{
P(full);
P(mutex2);
从buffer(out)中取出产品;
out=(out+1)mod n;
V(mutex2);
V(empty);
消费该产品;
}
|
不行
回复内容太短了!
回复内容太短了!
|
不行,即使可以增大了mutex的作用空间也会造成性能下降
|
P(empty);可以检测非空。当然是先测试再放入数据了
|
看不出p(mutex1)和p(mutex2)的作用
|
不能互换
P(empty);
P(mutex1);
假设互换:
即先
P(mutex1);
此时如果empty为空了,生产者就在此阻塞了,而且是占着mutex1阻塞的。此时消费者想消费一个产品都办不到,因为mutex1被生产者占有。
生产者、消费者都无法进行下去了。
P(empty);
P(mutex1);
假设互换:
即先
P(mutex1);
此时如果empty为空了,生产者就在此阻塞了,而且是占着mutex1阻塞的。此时消费者想消费一个产品都办不到,因为mutex1被生产者占有。
生产者、消费者都无法进行下去了。
|
本身命题就错误,你说可否互换的前提是不互换程序是正确的,但很显然,mutex1和mutex2你是期望保护同一段资源(不要告诉我in和out在内存里面不重叠),所以不管是否互换,程序都是错误的。
|
如果mutex1和mutex2不是同一个变量,那么这个程序的意义不是很大吧。
生产者使用mutex1,消费者使用mutex2,就不能防止消费着和生产者同时访问产品缓冲区,从而出现错误。
|
不行,P操作是危险操作,需要先P临界资源