使用单核处理器,所有线程都从一个 CPU 运行,在内存中的某个互斥体(或信号量等)上使用原子测试和设置操作来实现临界区的想法似乎很简单;因为您的处理器是从程序中的一个位置执行测试和设置,所以它一定不能从您程序中的另一个位置伪装成其他线程来执行测试和设置。
但是,当您确实拥有多个物理处理器时会发生什么?似乎简单的指令级原子性是不够的,b/c 有两个处理器可能同时执行它们的测试和设置操作,你真正需要保持原子性的是访问共享内存位置互斥体。(如果共享内存位置被加载到缓存中,那么整个缓存一致性问题也需要处理......)
这似乎会比单核情况产生更多的开销,所以这里是问题的核心:它有多糟糕?是不是更糟?我们只是忍受它吗?或者通过强制执行一个进程组中的所有线程必须位于同一个物理核心上的策略来回避它?