互斥锁会在任何时候阻塞所有线程吗?

Moh*_*fez 1 linux concurrency multithreading

在 Linux 中,假设我有 100 个线程的代码。其中 5 个线程竞争受互斥锁保护的共享资源。我知道当临界区实际运行时,只有 5 个线程在尝试获取锁时会停止执行,而其他 95 个线程将正常运行。

我的问题是,其他 95 个线程的执行是否会暂停或受到影响,即当互斥锁/内核/任何确定哪些线程在互斥锁上被阻塞以及哪个线程应该获得锁以及哪些线程应该被锁定时能够运行,因为他们不要求锁等

sle*_*ica 6

不,其他线程不受影响。

内核不会询问哪些线程受到锁的影响。每个线程在尝试获取锁时都会通知内核。

当线程这样做时,它们进入睡眠状态并进入与锁关联的特殊唤醒队列。

不使用锁的线程不会和使用锁的线程进入同一个队列,所以它们的阻塞行为是无关的。

  • 也许为了帮助解释这一点,唯一会停止其工作的线程(并非所有线程都必须执行相同类型的工作),是需要获取所持有的特定锁的线程。目标是获取锁,做任何你需要的事情(访问一个共享变量,增加一个计数器,等等),然后尽快释放锁,以便另一个线程可以获取它。 (2认同)