gpt4 book ai didi

c++ - 自旋锁与 std::mutex::try_lock

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:00 25 4
gpt4 key购买 nike

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

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

最佳答案

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

  1. 您天真的“假自旋锁”可能会在 CPU 旋转时使内部 CPU 总线饱和,从而使其他物理内核(包括持有锁的物理内核)处于饥饿状态。

  2. 如果 CPU 支持超线程或类似的东西,您天真的“假自旋锁”可能会消耗物理内核上的过多执行资源,使共享该物理内核的另一个线程处于饥饿状态。

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

  4. 您天真的“假自旋锁”与分支预测交互不良。当你最终获得锁时,你会在你锁定其他线程并需要尽快执行的地方获取所有错误预测分支的母体。这就像一个赛跑者打起精神准备在起跑线上奔跑,但当他听到发令枪声时,他停下来喘口气。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com