【问题标题】:Is this implementation of a general semaphore with binary semaphores correct?这种带有二进制信号量的通用信号量的实现是否正确?
【发布时间】:2016-02-10 13:40:33
【问题描述】:

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

这是我对此的看法。 好吧,如果有人实现了它,所以等待在信号之前先运行,就会出现死锁。程序将调用等待,递减计数,进入计数

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

【问题讨论】:

  • 至少告诉我你为什么投了反对票。我认为它可以工作,因为如果它首先运行信号,那么它会在没有死锁的情况下正常工作。
  • 这是一个相当严肃的调查。
  • 然后将您的假设和推测添加到您的问题帖子中,以展示您的努力。目前,您的问题看起来像您希望我们为您做作业。
  • 对不起,我应该对此添加我的想法

标签: concurrency semaphore binary-semaphore


【解决方案1】:

鉴于实施遵循以下原则:

  1. 二进制信号量S 保护count 变量免受并发访问。

  2. 如果非负数,count 反映通用信号量的可用资源数量。否则,count 的绝对值反映在二进制信号量 gate 上等待 (p5) 或 ready-to-wait(在 p4p5 之间)的线程数。

  3. 每个signal() 调用都会增加count,如果其上一个 值为负,则表示二进制信号量gate

但是,由于 ready-to-wait 状态的可能性,给定的实现不正确

假设thread#1 调用wait(),并且当前处于ready-to-wait 状态。假设另一个thread#2 也调用wait(),并且当前也处于ready-to-wait状态。

假设此时thread#3 调用signal()。因为 count 是负数 (-2),所以线程执行包括p10 (signal(gate)) 在内的所有操作。因为gate此时没有等待,所以变成free状态。

假设此时另一个thread#4 调用signal()。因为count 仍然是负数(-1),所以线程也执行包括p10 在内的所有操作。但是现在gate 已经处于free 状态。所以,signal(gate) 在这里是 no-op,我们有 missed 信号事件:只有 thread#1thread#2 之一将在执行 p5 后继续( wait(gate))。其他线程将永远等待

如果没有ready-to-wait 状态的可能性(即signal(S)wait(gate) 将被原子地执行),实现就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-03
    • 2015-07-03
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多