使用专门设计的自旋锁(例如 http://anki3d.org/spinlock )与这样的代码相比有什么好处:

std::mutex m;
while (!m.try_lock()) {}
# do work
m.unlock();

最佳答案

在典型的硬件上,有很多好处:

  • 在 CPU 旋转时,您天真的“假自旋锁”可能会使内部 CPU 总线饱和,从而使其他物理内核(包括持有锁的物理内核)饿死。
  • 如果 CPU 支持超线程或类似的东西,你天真的“假自旋锁”可能会消耗物理内核上过多的执行资源,从而导致共享该物理内核的另一个线程饿死。
  • 您天真的“假自旋锁”可能会执行导致不良缓存行为的无关写入操作。当您在x86/x86_64 CPU上执行读-修改-写操作时(例如try_lock可能执行的比较/交换),即使值未更改,它也始终会写入。此写入导致缓存行在其他内核上无效,要求它们在另一个内核访问该行时重新共享它。如果其他内核上的线程同时争用同一个锁,那就太糟糕了。
  • 你天真的“假自旋锁”与分支预测的相互作用很差。当您最终获得锁时,您就在锁定其他线程并需要尽快执行的地方获取所有错误预测分支的母分支。这就像一个运行者打起精神准备跑在起跑线上,但是当他听到发令枪响时,他停下来喘口气。

  • 基本上,该代码所做的一切都是错误的,自旋锁可能会出错。绝对没有任何事情是有效地完成的。编写好的同步原语需要深厚的硬件专业知识。

    关于c++ - 自旋锁与 std::mutex::try_lock,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35331209/

    10-11 18:13