解锁互斥锁的调用是否一定会切换到另一个被锁阻塞的线程?

Does a call to unlock a mutex necessarily switch to another thread that was blocked on the lock?

假设我们有两个线程:th1 和 th2。

让我们想象一下这一系列事件:

  1. Th1 锁定互斥锁并在它的临界区做一些工作。

  2. Th2 在互斥量上调用锁定但被阻止。

  3. Th1 完成其在临界区的工作并解锁互斥锁。

我现在的问题是:即使 th1 仍然有一些时间可以工作,解锁互斥锁的调用是否一定会导致立即上下文切换到被锁阻塞的线程(在本例中为 th2)有没有?

没有,或者至多定义了实现。

通常,无争议的互斥操作根本不需要进入内核,它们只是对内存位置的原子操作。当检测到冲突时,例如一个线程想要锁定另一个线程拥有的互斥量,想要的线程必须 进入 内核等待它;并且内核需要调整互斥锁,以便拥有线程 向内核发出信号 完成后。

区别在于enter可能会无限期阻塞,直到释放一个互斥体;而 signal 仅表示发生了此类事件。

当内核被告知有争议的互斥锁可用时,它必须至少启用等待线程 运行。当它 运行s 时,它可能会发现互斥量仍然不可用,并重新进入等待模式。

在释放线程之前的等待线程 运行 是否可以基于确定性的事情,例如优先级或调度 class。面对多处理器,两个线程可能同时在不同的 CPU 上释放,因此下一次获取互斥量可能完全不确定。

另一方面,某些系统,如 google 的公平调度互斥锁(完全在用户模式下完成)确保不会发生上一段暗示的饥饿。

因此实现已定义;并且您的实施提供的定义充分说明了您的实施。