互斥和 signal() 和 wait() 操作

Mutex and signal() and wait() operations

我有两个关于互斥锁的问题: 1. 当互斥变量等于 1 时,我们对其进行 signal() 操作,预期会发生什么? 2. 当mutex 等于0 时,我们执行wait(),然后线程被阻塞,mutex 保持为0。对吗?过了一会儿,另一个线程进行 signal() 操作,然后阻塞被释放。现在互斥体的价值是多少? 0 还是 1?

所以从概念上讲,互斥锁有两种状态:锁定和解锁。是0还是1表示这里不重要

如果您解锁(即发出信号)互斥锁,它会将其状态从锁定更改为解锁。进一步解锁不会改变它的状态,它实际上什么也不做。

如果一个互斥量被解锁并且您调用等待,则该调用什么都不做(它不等待)并且线程继续执行。

当互斥量被锁定并且您调用 wait 时线程被阻塞。当其他线程调用 unlock 时,阻塞被释放,互斥锁被解锁。

最重要的是解锁和锁定操作是原子的,因为并行调用不能相互重叠以产生损坏的结果(正式地:对 lock/unlock 的并行调用总是等同于一些序列化的调用历史).否则互斥量的整个概念将是愚蠢的。 :)

阅读评论(和未经编辑的原始问题)后,很明显有足够多的人相信二进制信号量可以与互斥锁互换。如果我们用实际的术语来说(即 pthread mutex 和 System V semaphore),它们是非常不同的。我将尝试在下面概述最重要的差异。

  1. 概念所有权。互斥量由它们的储物柜拥有,信号量不属于任何人。这导致了两个区别。 非常重要 一个是互斥量可以(应该)只能由所有者(锁定线程)解锁,而信号量可以由任何线程解锁(权限见下文)。不太重要的是互斥锁可以被设置为 re-entrant——也就是说,可以用所有者线程多次锁定——而信号量不能这样做。我说它不太重要,因为可重入互斥锁几乎总是存在设计缺陷。
  2. 信号量是或多或少独立于用户的对象。它们可以由完全不相关的进程或线程创建、使用和销毁,这些进程或线程甚至不必相互了解任何事情(或同时执行)。例如,一个进程可能会创建一个信号量然后死掉,其他进程可以使用它,而第三个进程将删除它)。信号量具有与之关联的 权限 (与文件权限不同),而互斥量则没有这样的东西 - 技术上有权访问互斥量的任何人都可以使用它做任何事情。
  3. 信号量是 process-shared。也就是说,它们可以被多个进程使用而无需额外的努力。默认互斥体只有single-process,如果同一个互斥体要被多个进程使用,则必须在特殊模式下创建。