【问题标题】:Confusion over implementation of wait() operation for semaphore对信号量的 wait() 操作的实现感到困惑
【发布时间】:2017-08-18 11:37:59
【问题描述】:

我无法理解 wait() 中的原子操作。在许多资料/书籍中,wait() 操作都是这样实现的:

wait(S) {
  while S <= 0;
  S--;
}

如果 S--、S即使这样,两个线程也可能会减少 S 值。 然后使用信号量的整个想法就丢失了。

我什至从Wikipedia 那里找到了一些支持,它给出了如下所示的 wait() 实现,并说如果包含 S-- 的块是原子的。对我来说,这完全有道理。

wait(S) {
    while true:
       [ if S<= 0:
            S--;
       ]

关于第一次实现 wait() 的任何想法。我是不是错过了什么。

【问题讨论】:

  • “等待操作在许多资料/书籍中都是这样实现的”:这不是真的。它不是在源代码中以这种方式实现的,因为它会像你说的那样被破坏。在书中,它是描述,而不是实现,并且可能会以您指示的方式进行描述以帮助您理解它。不过,维基百科中的描述更准确。

标签: multithreading algorithm operating-system


【解决方案1】:

信号量S除了初始化之外只能通过signal和wait操作访问。

即使这样,两个线程也可能会减少 S 值。然后整个想法 使用信号量的方法丢失了。

不,不可能。唯一可能的是多个线程可以尝试减少S 的值。

假设有多个线程在 while 循环中等待。这意味着S 是0。一旦 signal 被执行,S 就会变成 1 并且条件

while S <= 0

变成假的。并且只有一个线程会成功执行S-- 语句。引用操作系统的圣经Galvin、silberschatz 和 gagne 的操作系统原理

所有对信号量整数值的修改 wait() 和 signal() 操作必须不可分割地执行。那是, 当一个进程修改信号量值时,没有其他进程可以 同时修改相同的信号量值。此外,在 wait(S)的情况下,测试S

【讨论】:

  • 我想我在阅读时错过了这一行,“另外,在等待(S)的情况下,对S
猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多