Spinlock实现推理

时间:2018-03-12 10:10:34

标签: c++11 boost spinlock

我想通过替换一些互斥体来提高程序的性能 用自旋锁。我在

中找到了一个spinlock实现

我打算重用。我相信这个实现比简单的实现更安全,在这些实现中线程会像在这里找到的那​​样永远尝试

但我需要澄清一下这里的yield函数

首先,我可以假设数字4,16,32是任意的。我实际测试了其他一些值,我发现在我的情况下我通过使用其他值获得了最佳性能。

但有人可以解释收益率代码背后的原因。具体来说,为什么我们需要这三个

  • BOOST_SMT_PAUSE
  • sched_yield
  • nanosleep

1 个答案:

答案 0 :(得分:2)

是的,这个概念被称为“自适应自旋锁” - 参见例如https://lwn.net/Articles/271817/

通常会为指数后退选择数字:https://geidav.wordpress.com/tag/exponential-back-off/

所以,这些数字并不是随意的。但是,哪些“数字”适用于您的案例取决于您的应用程序模式,要求和系统资源。

引入“微延迟”的三种方法是明确设计的,以平衡成本和潜在收益:

  • 零成本是在高CPU上旋转,但它会导致高功耗和浪费周期
  • 一个小的“廉价”延迟可能能够防止上下文切换的成本,同时相对于busy-spin减少CPU负载
  • 一个简单的yield可能允许操作系统根据其他系统负载避免上下文切换(例如,如果线程数<数逻辑核心)

对于低延迟应用程序而言,这些问题的权衡非常重要,因为上下文切换或缓存未命中的影响很大。

TL; DR

所有权衡尝试在浪费CPU周期和丢失缓存/线程效率之间找到平衡。