【发布时间】:2016-05-21 17:59:34
【问题描述】:
与这样的代码相比,使用专门设计的自旋锁(例如http://anki3d.org/spinlock)有什么好处:
std::mutex m;
while (!m.try_lock()) {}
# do work
m.unlock();
【问题讨论】:
-
为什么不只是
m.lock();?忙碌的等待有什么意义? -
在这种情况下,我有许多空闲的内核,并且希望最小化每个线程开始工作的延迟。感觉自旋锁是我需要的,但我不明白为什么使用互斥锁不常见,而且我一直看到不同的自旋锁实现。
-
我怀疑
try_lock()和lock()一样贵,而且你得到了两全其美的结果——访问内核的成本,以及将你的 CPU 用作空间加热器. -
那么手动自旋锁的好处是它可以保证在用户空间中旋转?如果 try_lock 需要系统调用,那么我将失去上下文并支付延迟?
-
@user2411693 如果你认为你的平台的自旋锁实现是如此糟糕,以至于即使是最简单的实现也更好,你应该假设你的平台也提供了其他东西,然后放弃平台。