我刚刚开始研究多线程编程和线程安全。我熟悉忙等待,经过一些研究,我现在熟悉自旋锁背后的理论,所以我想我会看看 OSSpinLock 在 Mac 上的实现。它归结为以下函数(在 objc-os.h 中定义):
static inline void ARRSpinLockLock(ARRSpinLock *l)
{
again:
/* ... Busy-waiting ... */
thread_switch(THREAD_NULL, SWITCH_OPTION_DEPRESS, 1);
goto again;
}
(这里完全实现)
在进行了一些挖掘之后,我现在对thread_switch
参数的作用有了大致的了解(这个站点是我找到它的地方)。我对我所读内容的解释是,对 thread_switch 的特定调用将切换到下一个可用线程,并将当前线程的优先级降低到 1 个周期的绝对最小值。“最终”(在 CPU 时间内)该线程将再次激活并立即执行重新goto again;
开始忙碌等待的指令。
不过,我的问题是,为什么这个电话实际上是必要的?我在这里找到了另一种自旋锁的实现(这次是针对 Windows),它根本不包括(Windows 等效的)线程切换调用。