如何在多核上实现锁

use*_*851 6 operating-system mutex multicore multiprocessor locks

对于单处理器,锁定算法非常简单。

Lock(threadID) {
  Disable Interrupts
  If lock is already owned by same thread{
    Restore Interrupts
    return
  }
  if lock is free {
    make lock busy
    set current thread as the owner of the lock
  }
  else {
     add threadID to the lock queue.
  }
  Restore Interrupts
  return
}
Run Code Online (Sandbox Code Playgroud)

但是我们如何在多处理器/多核系统中实现这段代码。如果 2 个内核/进程尝试为不同的进程提供相同的锁怎么办。

Kar*_*tan 2

互斥体通常通过对单个内存值进行原子操作来实现。例如,锁可以是一个单词,当 时空闲0,当 时锁定1。为了获取锁,处理器将锁定内存总线(因此其他处理器无法读取或写入内存),读取该字的最新值,1如果是0,则将其设置为 ,然后解锁内存总线。如需解锁,可将该字设置为0

这是一个简单的示例,没有解决争用锁时发生的情况。不同的操作系统使用不同的机制来处理该问题。Linux 使用称为futexes的东西。我不确定 Windows 或 Mac 会做什么。

尽管您发布的算法是正确的,但非内核代码无法禁用 CPU 中断,因此即使在单核上,用户空间代码也倾向于使用原子操作。