首页 文章

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

提问于
浏览
-1

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

semaphore in question

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

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

1 回答

  • 0

    鉴于实施遵循以下原则:

    • 二进制信号量 S 保护 count 变量来自并发访问 .

    • 如果非负, count 反映一般信号量的免费资源数量 . 否则, count 的绝对值反映二进制信号量 gate 上等待( p5 )或 ready-to-waitp4p5 之间)的线程数 .

    • 每个 signal() 调用递增 count ,如果其先前值为负,则表示二进制信号量 gate .

    但是,由于 ready-to-wait 州的可能性, given implementation is incorrect

    假设 thread#1 调用 wait() ,并且当前处于准备等待状态 . 假设另一个 thread#2 也调用 wait() ,并且当前也处于准备等待状态 .

    假设 thread#3 此时调用 signal() . 因为count是负数(-2),所以线程执行所有操作,包括 p10signal(gate) ) . 因为 gate 目前没有等待,所以它变为自由状态 .

    假设此时另一个 thread#4 调用 signal() . 因为 count 仍为负数(-1),所以该线程还执行包括 p10 在内的所有操作 . 但现在 gate 已经处于自由状态 . 所以, signal(gate) 在这里是no-op,我们错过了信号事件:执行 p5wait(gate) )后, thread#1thread#2 中只有一个会继续 . 其他帖子 will wait forever .

    没有准备等待状态的可能性(即 signal(S)wait(gate) 将以原子方式执行),实现就可以了 .

相关问题