这个具有二进制信号量的通用信号量的实现是否正确?

时间:2015-11-09 19:51:32

标签: concurrency semaphore binary-semaphore

证明或反驳以下信号量的正确性。

semaphore in question

以下是我对此的看法。 好吧,如果有人实现了它,那么等待在信号之前先运行,就会出现死锁。该程序将调用wait,减量计数,输入计数< 0条件并在门口等待。因为它在门口等待,所以它不能进入​​等待后的信号。所以在这种情况下,这可能意味着信号量不正确。

但是,如果我们假设两个进程正在运行,一个先运行等待,另一个先运行另一个运行信号,那么如果第一个进程运行等待并阻塞等待(gate),那么另一个进程可以运行信号并释放被阻止的进程。因此,继续该方案将使算法有效并且不会导致死锁。

1 个答案:

答案 0 :(得分:0)

鉴于实施遵循以下原则:

  1. 二进制信号量S保护count变量不会出现并发访问。

  2. 如果是非负数,count会反映一般信号量的免费资源数量。否则,count的绝对值反映等待(p5)或准备等待(在p4p5之间)的线程数on binary semaphore gate

  3. 每{{}}}次呼叫增加signal(),如果其上一个值为负,则表示二进制信号量count

  4. 但是,由于准备等待状态的可能性,给定的实现不正确

    假设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#2p5)后。其他线程将永远等待

    没有准备等待状态的可能性(即wait(gate)并且signal(S)将被执行原子)实现就可以了。