对信号量的 wait() 操作实现的困惑

阿卡什迪普·萨鲁加

我无法理解 wait() 中的原子操作。在许多来源/书籍中,wait() 操作是以这种方式实现的:

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

如果诸如 S--、S<=0 和 S++ 的信号 op 等操作是原子的。即使这样,两个线程也可能会减少 S 值。然后使用信号量的整个想法就丢失了。

我什至从维基百科中找到了一些支持,它提供了如下的 wait() 实现,并说如果包含 S-- 的块是原子的。对我来说这是完全有道理的。

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

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

苏梅特

S除了初始化之外的信号量只能通过信号等待操作访问

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

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

假设有多个线程在 while 循环中等待。这意味着S0一旦信号被执行,S就变成1了条件

while S <= 0

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

在 wait() 和 signal() 操作中对信号量整数值的所有修改都必须不可分割地执行。也就是说,当一个进程修改信号量值时,没有其他进程可以同时修改相同的信号量值。另外,在wait(S)的情况下,对S<=0的整数值的测试及其可能的修改S--,也必须不间断地执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何实现信号量

来自分类Dev

如何实现信号量

来自分类Dev

窥视操作的信号量

来自分类Dev

用std :: mutex实现信号量

来自分类Dev

信号量/关键部分的实现

来自分类Dev

用队列实现信号量

来自分类Dev

dispatch_semaphore_wait不等待信号量

来自分类Dev

dispatch_semaphore_wait不等待信号量

来自分类Dev

使用二进制信号量实现计数信号量

来自分类Dev

对信号量类有点困惑

来自分类Dev

子进程中的命名信号量使我感到困惑

来自分类Dev

在Go中实现信号量的最佳方法是什么

来自分类Dev

使用x86程序集的信号量实现

来自分类Dev

如何在C中实现自己的信号量?

来自分类Dev

信号量系统V-样本实现

来自分类Dev

Java 信号量实现和设计相关问题

来自分类Dev

操作系统的信号量和Java给出的信号量之间有什么区别?

来自分类Dev

信号量在OSX / Ubuntu / Soliars上的行为不同,线程在sem_wait()之后执行

来自分类Dev

奇怪的POSIX信号量行为(卡在Linux上的sem_wait上)

来自分类Dev

如何实现信号量?这个实现是正确的还是错误的?

来自分类Dev

信号量wait()函数中while循环的目的是什么?可以用if语句代替吗?

来自分类Dev

信号量实现:为什么禁用测试和设置所需的中断?

来自分类Dev

我可以在Java中使用信号量实现阻塞队列吗?

来自分类Dev

Java中的内存泄漏?用信号量实现餐饮哲学家

来自分类Dev

在信号量上下文中,P和V操作的原始含义是什么?

来自分类Dev

Vulkan中的信号量何时用于在队列操作和主机之间插入依赖关系?

来自分类Dev

定时信号量

来自分类Dev

了解信号量...

来自分类Dev

与信号量同步

Related 相关文章

热门标签

归档