我想通过替换一些互斥体来提高程序的性能 用自旋锁。我在
中找到了一个spinlock实现我打算重用。我相信这个实现比简单的实现更安全,在这些实现中线程会像在这里找到的那样永远尝试
但我需要澄清一下这里的yield函数
首先,我可以假设数字4,16,32是任意的。我实际测试了其他一些值,我发现在我的情况下我通过使用其他值获得了最佳性能。
但有人可以解释收益率代码背后的原因。具体来说,为什么我们需要这三个
BOOST_SMT_PAUSE
sched_yield
和nanosleep
答案 0 :(得分:2)
是的,这个概念被称为“自适应自旋锁” - 参见例如https://lwn.net/Articles/271817/
通常会为指数后退选择数字:https://geidav.wordpress.com/tag/exponential-back-off/
所以,这些数字并不是随意的。但是,哪些“数字”适用于您的案例取决于您的应用程序模式,要求和系统资源。
引入“微延迟”的三种方法是明确设计的,以平衡成本和潜在收益:
yield
可能允许操作系统根据其他系统负载避免上下文切换(例如,如果线程数<数逻辑核心)对于低延迟应用程序而言,这些问题的权衡非常重要,因为上下文切换或缓存未命中的影响很大。
所有权衡尝试在浪费CPU周期和丢失缓存/线程效率之间找到平衡。