自旋锁实现推理

Spinlock implementation reasoning

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

中找到了自旋锁实现

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

但是我需要澄清一些关于此处找到的 yield 函数的事情

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

但是有人可以解释一下 yield 代码背后的原因吗?具体来说,为什么我们需要这三个

是的,这个概念被称为 "adaptive spinlock" - 参见例如https://lwn.net/Articles/271817/.

通常选择指数back-off的数字:https://geidav.wordpress.com/tag/exponential-back-off/

因此,数字不是任意的。但是,哪种 "numbers" 适合您的情况取决于您的应用程序模式、要求和系统资源。

介绍 "micro-delays" 的三种方法明确旨在平衡成本和潜在收益:

  • zero-cost是在high-CPU上自旋,但是会导致高耗电和浪费周期
  • 一个小的 "cheap" 延迟可能能够防止 context-switch 的成本,同时减少 CPU 相对于 busy-spin
  • 的负载
  • 一个简单的 yield 可能允许 OS 避免上下文切换,这取决于其他系统负载(例如,如果线程数 < 逻辑核心数)

这些 trade-offs 对于 low-latency 应用程序很重要,在这些应用程序中,上下文切换或缓存未命中的影响很重要。

TL;DR

所有 trade-offs 尝试在浪费 CPU 周期和损失 cache/thread 效率之间找到平衡。