Spinlock vs std :: mutex :: try_lock

use*_*693 5 c++ mutex spinlock

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

std::mutex m;
while (!m.try_lock()) {}
# do work
m.unlock();
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 8

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

  1. 当CPU旋转时,你天真的"假螺旋锁"可能会使内部CPU总线饱和,使其他物理内核(包括持有锁的物理内核)匮乏.

  2. 如果CPU支持超线程或类似的东西,你的天真"假螺旋锁"可能会消耗物理核心上的过多执行资源,使共享该物理核心的另一个线程匮乏.

  3. 你天真的"假螺旋锁"可能会执行无关的写操作,导致缓存行为不良.当您在x86/x86_64 CPU上执行读取 - 修改 - 写入操作时(如try_lock可能执行的比较/交换),即使值未更改,它也始终写入.此写入会导致高速缓存行在其他核心上失效,要求它们在另一个核心访问该行时重新共享它.如果其他核心上的线程同时争用同一个锁,那就太糟糕了.

  4. 你的幼稚"假螺旋锁"与分支预测相互作用很严重.当你最终获得锁定时,你将所有错误预测分支的母亲带到你锁定其他线程并需要尽快执行的位置.这就像一个跑步者全部被抽出并准备在起跑线上跑,但是当他听到起动手枪时,他停下来喘口气.

基本上,该代码完成了一切错误,因为自旋锁可能会出错.绝对没有什么是有效的.编写好的同步原语需要深入的硬件专业知识.

  • 当您在x86/x86_64 CPU上执行读取 - 修改 - 写入操作时(如try_lock可能执行的比较/交换),即使值未更改,它也始终写入.此写入会导致高速缓存行对其他核心无效,要求它们在另一个核心访问该行时重新共享它.(请注意,所有这些可能不适用于每个平台.) (2认同)