我被要求写:输入以下情况的函数和退出函数:
有N个过程和M个类型的过程(N>> M) 有一个关键部分,其中所有具有相同类型的进程都可以进入。 例如:如果类型A在cs中,则类型B不能输入cs。但是所有类型A的进程都可以进入。
我只能使用互斥和“类型”这是进程的类型。 不允许死锁。
你认为这样可以吗?shared: this.type = -1;
mutex m, m1=1;
enter{
down(m)
if (this.type == process.type) up(m1)
down(m1)
this.type= process.type
up(m)
}
exit {
this.type = -1
up(m1)
}
谢谢! (顺便说一句,这不是HW。我参加考试,而且我正在解决前几年的考试)
答案 0 :(得分:0)
我会说不,目前的方法还不行。
具体来说,假设0型进来,并通过输入。类型1然后在类型0退出之前通过。它命中互斥锁,发现进程类型错误并锁定在m1上。然后输入0,解锁m,重置过程类型,并且m1上的锁定仍然有效。
此外,如果您有2个类型为0的进程,则第一个要退出的进程将导致正在重置正在运行的进程类型,而进程仍处于关键部分。
我假设“向上”类似于解锁,“向下”类似于锁定;它听起来像是一组用于信号量的方法。我也假设系统只有两个互斥锁(m和m1);因为标记并不十分清楚。
编辑:你提出的建议会出现这样的事情:
shared: this.type = -1;
mutex m, m1=1;
count=0;
enter{
down(m)
if (this.type == process.type) up(m1)
down(m1)
this.type= process.type
count++;
up(m)
}
exit {
count--;
if(count==0) this.type = -1
up(m1)
}
这仍然存在退出对状态修改不是线程安全的问题;当一个新的进程被唤醒/开始执行时,它的弟兄们不会被唤醒。
我不完全确定在没有条件变量的情况下有一种安全的方法可以做到这一点;除非有关于可用问题的更多信息。 (即这是在'Monitor'的上下文中,其中方法执行已经是线程安全的)
答案 1 :(得分:0)
我想你说的话,我确实可以看到问题 - 10X!
添加计数器怎么样? 当相同类型的第一个进程输入时,如果计数器== 0 type == process.type (初始化类型)
退出中的:counter--如果(count == 1)type = -1,我会好意的。
更好??