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