使用信号量实现监视器

时间:2012-04-20 20:30:11

标签: synchronization operating-system semaphore locks

我被问到以下问题而且我不确定它的正确答案是什么:

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?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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