mutex内部是如何实现的

Mat*_*kár 4 java multithreading synchronization mutex

我花了一些时间试图了解互斥锁是如何用多种语言实现的。有多个链接描述该主题(*),但如果我理解正确的话,所有硬件提供的都是一些原子操作,可能有助于区分现在应该轮流是谁。

在软件中,这总是用于忙等待(尝试 CAS 或测试并设置,如果不成功,则在 while 循环中等待),但是调度程序如何知道现在我应该从 CPU 中拿走进程/线程,因为它所做的一切是它在等待吗?操作系统是否提供一些支持,例如 Java 同步用于发出“我被阻止,请让其他线程运行”的信号?我认为是的,因为忙等待是使用 lock() 的替代方法;(所以它们不应该相同)

*来源:

Vic*_*kin 5

在 Linux JDK 中,源 C 代码使用的pthread库是标准 C 库的一部分。反过来,它使用了 Linux 内核futex功能 ( man futex)。据我所知,这是使用内核调度程序实现的,将调用线程置于睡眠状态并在收到信号时将其唤醒。

调度程序本身依赖于定时器中断(硬件)来工作——本质上,每次定时器中断到达时,调度程序都必须检查当前用户空间线程是否想要/必须被挂起,如果是,它必须选择其他线程。

这里有一些进一步的链接,可以提供更清晰和详细的解释:

  1. http://man7.org/linux/man-pages/man7/futex.7.html
  2. http://www.quora.com/How- Different-is-a-futex-from-mutex-conceptually-and-also-implementation-wise
  3. Robert Love 的书Linux Kernel Development(但奇怪的是,它没有提及futex和另一本书(确实包含 futex 提及,但主要是在引用外部论文时):Kerrisk 的The Linux Programming Interface

  • 不 - 在与操作系统无关的术语中 - 您的应用程序线程使用“takeMutex()”调用内核。在内核空间的实现中,“takeMutex()”可能会看到互斥锁已被占用,并以一种或另一种形式调用调度程序。调度程序的计时器触发器主要是为所有处于“运行”状态的线程授予“公平”的时间片。 (2认同)