使用专门设计的自旋锁有什么好处(例如http://anki3d.org/spinlock) 与这样的代码:
std::mutex m;
while (!m.try_lock()) {}
# do work
m.unlock();
在典型的硬件上,有巨大的好处:
你天真的“假自旋锁”可能会在 CPU 旋转时使内部 CPU 总线饱和,从而导致其他物理内核(包括持有锁的物理内核)挨饿。
如果CPU支持超线程或类似的东西,你天真的“假自旋锁”可能会消耗物理核心上的过多执行资源,从而使共享该物理核心的另一个线程挨饿。
您天真的“假自旋锁”可能会执行无关的写入操作,从而导致不良的缓存行为。当您在 x86/x86_64 CPU 上执行读取-修改-写入操作(如 try_lock 可能执行的比较/交换)时,即使值未更改,它也始终会写入。此写入会导致缓存行在其他核心上失效,从而要求它们在另一个核心访问该行时重新共享它。如果其他核心上的线程同时争用同一锁,那就太糟糕了。
你天真的“假自旋锁”与分支预测相互作用很差。当您最终获得锁定时,您将在锁定其他线程并需要尽快执行的位置获取所有错误预测分支的母分支。这就像一个赛跑者在起跑线上精神抖擞地准备奔跑,但当他听到发令枪声时,他停下来喘口气。
基本上,该代码做错了自旋锁可能做错的所有事情。绝对没有什么事情是高效完成的。编写良好的同步原语需要深厚的硬件专业知识。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)