2

我被问到以下问题,我不确定正确答案是什么:

If monitors are implemented by replacing condition variables with semaphores 
(counters set to 0) with down() and up() as wait and signal, respectively,
would the monitors work correctly?

我很想说这是一个正确的实现,因为信号量和条件变量可以相互替换,对吗?有更好的解释吗?

4

1 回答 1

3

您正在询问初始化为 1 的信号量,它也称为二进制信号量

答案取决于这些原语的特定实现(或定义),但是典型的区别是监视器具有线程所有权而信号量没有。这会影响各种场景。

  • 对于一个信号量来说,一个线程完成所有的上升而另一个线程完成所有的下降是完全正常的。监视器不应该允许这样做。
  • 假设您有一个具有私有状态和多个公共方法的类,所有这些方法在进入时锁定一个公共监视器并在退出时解锁以保护该状态。还假设公共方法在A内部调用公共方法B。然后,递归监视器将正确地允许调用方法A(这涉及序列 lock-lock-unlock-unlock),而与信号量实现的监视器相同,在第二次尝试使用同一线程锁定时会导致死锁。
  • 假设一个线程获取了一个命名的系统范围的监视器并崩溃了。由于线程所有权,可以自动解锁监视器并允许任何等待的线程获取它。使用二进制信号量这是不可能的,并且这种情况通常在重新启动之前永远不会令人满意地解决。[编辑:请注意,即使在互斥体的情况下,所描述的恢复机制也可能不需要或默认启用,因为受保护资源或数据结构的状态在中途崩溃后基本上是未定义的。是否重新获取或以不同方式恢复的决定通常留给应用程序代码。]

因此,二进制信号量类似于监视器,但不要期望它的行为相同。

于 2012-04-20T20:43:16.273 回答