首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自旋锁实现推理

自旋锁实现推理
EN

Stack Overflow用户
提问于 2018-03-12 10:10:34
回答 1查看 372关注 0票数 3

我想通过用自旋锁替换一些互斥锁来提高程序的性能。中找到了一个自旋锁实现。

  • sync.hpp

我打算重新使用。我相信这个实现比简单的实现更安全,在这种实现中,线程一直在尝试,就像这里所发现的那样。

  • spinlock.implementation

但是我需要澄清一些关于这里发现的产量函数的东西

  • k.hpp

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

但是有人能解释一下屈服码背后的推理吗。特别是为什么我们需要这三个

  • BOOST_SMT_PAUSE
  • sched_yield
  • nanosleep
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-12 16:09:29

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

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

所以,这些数字不是任意的。但是,哪个“数字”可以用于您的情况,取决于您的应用程序模式、需求和系统资源。

引入“微延迟”的三种方法明确地旨在平衡成本和潜在收益:

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

在上下文切换或缓存丢失的影响很大的低延迟应用程序中,它们之间的权衡是非常重要的。

TL;DR

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49232620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档