证明或反驳以下信号量的正确性 .
以下是我对此的看法 . 好吧,如果有人实现了它,那么等待在信号之前先运行,就会出现死锁 . 程序将调用等待,减量计数,输入计数<0条件并在门处等待 . 因为它在门口等待,所以它不能进入等待后的信号 . 所以在这种情况下,这可能意味着信号量不正确 .
但是,如果我们假设两个进程正在运行,一个先运行等待,另一个先运行另一个运行信号,那么如果第一个进程运行等待并阻塞等待(gate),那么另一个进程可以运行信号并释放进程受阻 . 因此,继续该方案将使算法有效并且不会导致死锁 .
1 回答
鉴于实施遵循以下原则:
二进制信号量
S
保护count
变量来自并发访问 .如果非负,
count
反映一般信号量的免费资源数量 . 否则,count
的绝对值反映二进制信号量gate
上等待(p5
)或 ready-to-wait (p4
和p5
之间)的线程数 .每个
signal()
调用递增count
,如果其先前值为负,则表示二进制信号量gate
.但是,由于 ready-to-wait 州的可能性, given implementation is incorrect :
假设
thread#1
调用wait()
,并且当前处于准备等待状态 . 假设另一个thread#2
也调用wait()
,并且当前也处于准备等待状态 .假设
thread#3
此时调用signal()
. 因为count是负数(-2),所以线程执行所有操作,包括p10
(signal(gate)
) . 因为gate
目前没有等待,所以它变为自由状态 .假设此时另一个
thread#4
调用signal()
. 因为count
仍为负数(-1),所以该线程还执行包括p10
在内的所有操作 . 但现在gate
已经处于自由状态 . 所以,signal(gate)
在这里是no-op,我们错过了信号事件:执行p5
(wait(gate)
)后,thread#1
和thread#2
中只有一个会继续 . 其他帖子 will wait forever .没有准备等待状态的可能性(即
signal(S)
和wait(gate)
将以原子方式执行),实现就可以了 .