为什么持有自旋锁时不允许“睡眠”? [复制]

2023-12-23

可能的重复:
为什么持有自旋锁时不能睡觉? https://stackoverflow.com/questions/4752031/why-cant-you-sleep-while-holding-spinlock

据我所知,自旋锁应该在短时间内使用,并且只是代码中的选择,例如不允许休眠(抢占)的中断处理程序。

但是,我不知道为什么有这样一个“规则”,即在持有自旋锁时根本不应该睡觉。我知道这不是推荐的做法(因为它对性能有害),但我认为没有理由在自旋锁中不允许睡眠。

获取信号量时不能持有自旋锁,因为在等待信号量时可能必须休眠,并且持有自旋锁时不能休眠(来自 Robert Love 的《Linux 内核开发》)。

我能看到的唯一原因是出于可移植性的原因,因为在单处理器中,自旋锁被实现为禁用中断,并且通过禁用中断,睡眠当然是不允许的(但睡眠不会破坏SMP系统中的代码)。

但我想知道我的推理是否正确,或者是否还有其他原因。


至少在 Linux 中,不允许在自旋锁中休眠有几个原因:

  1. 如果线程 A 在自旋锁中休眠,然后线程 B 尝试获取相同的自旋锁,则单处理器系统将发生死锁。线程 B 永远不会进入睡眠状态(因为自旋锁没有在 A 完成时唤醒 B 所需的等待列表),并且线程 A 永远不会有机会醒来。
  2. 使用自旋锁而不是信号量正是因为它们更高效 -provided你们不会争太久。允许睡眠意味着您将有很长的争用期,从而消除了使用自旋锁的所有好处。在这种情况下,仅使用信号量您的系统会更快。
  3. 自旋锁通常用于与中断处理程序同步,通过此外禁用中断。如果您处于睡眠状态,则此用例是不可能的(一旦进入中断处理程序,您就无法切换回线程以让它唤醒并完成其自旋锁关键部分)。

使用正确的工具完成正确的工作 - 如果您需要睡觉,信号量和互斥体就是您的朋友。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么持有自旋锁时不允许“睡眠”? [复制] 的相关文章

随机推荐

  • OSX Lion 升级后 perl“.../config.h,`Makefile' 需要”不工作

    SOLVED 见底部 刚刚升级到 OSX Lion 并尝试让我的 Perl 安装再次运行 sudo usr bin perl MCPAN e install MODULENAME 具有任意值MODULENAME我尝试过的 例如JSON 产生
  • 如何在 shell 脚本中检测 BSD 与 GNU 版本的日期

    我正在编写一个需要执行一些日期字符串操作的 shell 脚本 该脚本应该跨尽可能多的 nix 变体工作 因此我需要处理机器可能具有 BSD 或 GNU 版本的 date 的情况 测试操作系统类型的最优雅的方法是什么 以便我可以发送正确的日期
  • 如何在 JavaScript 中禁用重复按键[重复]

    这个问题在这里已经有答案了 我和这个人有同样的问题如何禁用 jQuery 中的重复按键 https stackoverflow com questions 9098901 how to disable repetitive keydown
  • Eclipse Maven 依赖项未找到

    我已添加到项目存储库的 pom xml 中
  • Swing - 替代 Qt 信号/槽

    在 Qt GUI 中 使用信号和槽非常方便 它解耦事件传递 当我创建一些抛出信号的小部件时 我不必提前知道谁可以获取它 然后使用connect我指定连接 Java Swing 中什么是并行 您能指出关于这个问题的好资源吗 如果没有现有的Ev
  • 在 Jade 中快速显示 mongodb 文档

    我正在学习 Node Express Jade 和 Mongodb 我无法在 jade 中显示我的 mongodb 文档 我自己无法弄清楚 我已使用 console log 成功记录所有文档 并且它正确显示所有文档 请不要使用猫鼬或其他解决
  • 如何在 ruby​​ 上的哈希中创建 deep_slice

    我正在寻找一种干净的方法来执行此操作 我找到了一些解决方法 但没有找到类似切片的东西 有些人建议使用 gem 但我认为此操作不需要 如果我错了 请纠正我 所以我发现自己有一个包含一堆哈希值的哈希值 我想要一种方法来执行Slice https
  • 更改每个文件的下载位置和名称

    我正在使用 Selenium 和 Chrome WebDriver 进行自动化 该应用程序必须执行一系列下载 需要使用不同的名称 数据 报告类型 和与我正在下载的报告类型匹配的文件夹进行保存 问题是我只能在实例化新驱动程序时设置默认目录 v
  • spring 2.5中基于注解的配置和基于xml的配置可以一起使用吗?

    我一直在从事一个项目 其中控制器是为了扩展控制器类而编写的 我可以在同一应用程序中配置和使用基于 POJO 的控制器 使用 Controller 吗 非常感谢 感谢 jamestastic 和 skaffman 现在一切正常 以下是需要添加
  • 无法在 Windows 8 应用程序内创建动态磁贴

    我的要求是在应用程序页面之一内创建动态磁贴 但现在我能够创建仅驻留在 Windows 8 平板电脑的开始屏幕中的图块 但我需要在应用程序内创建一个图块 我使用的环境 Visual Studio 2011 测试版 其针对平板电脑的 Windo
  • 在 CodeIgniter 中扩展 HMVC 模块

    假设我们有一个名为core crud在控制器中使用类似的内容 if defined BASEPATH exit No direct script access allowed class Core crud extends MX Contr
  • OpenFileDialog VBA (Powerpoint) 初始目录

    请帮我做我的OpenFileDialog显示我的 PowerPoint 项目目录 我试过 InitialDirectory C 但它不起作用 我可以适应这个吗vba questions tagged vba 谢谢 这几乎是从 Powerpo
  • 为什么为 numpy 函数选择名称“arange”?

    numpy 函数有具体原因吗arange https docs scipy org doc numpy reference generated numpy arange html被如此命名 People 习惯性地 https www goo
  • 如何在 F# 中比较 x 和 y?

    我需要有关比较 2 个数字的匹配模式的帮助 像这样的东西 let test x y match x with y when x lt y gt printfn less than y when x gt y gt printfn great
  • 如何检测函数的输出是否分配给 R 中的对象

    在 R 函数内部 是否可以检测用户是否已将输出分配给对象 例如 仅当输出未分配给对象时 我想在控制台上打印一些信息 我正在寻找类似的东西 fun lt function a b lt a 2 if
  • 将 JComponent 及其子组件视为一个整体的工具提示行为? (无闪烁)

    我有一个带有多个子组件的 JComponent 我希望它有一个将组件视为一个整体的工具提示 例如 如果你看这个解决方案 https stackoverflow com a 284101 411282对于类似的问题 当您从一个子组件切换到另一
  • JSONcpp 迭代对象内的列表

    我的 json 对象中有一个列表 我想迭代列表的元素 我看到了下面这个帖子遍历 JsonCpp 中的对象 https stackoverflow com questions 4800605 jsoncpp iterate thru all
  • AVAudioPlayer 返回成功但设备没有声音

    我有一个非常简单的应用程序 我构建它来测试 AVAudioPlayer 我有一个 16s aif 文件 在我的 Mac 上运行得很好 把它放在一个简单的应用程序中并在我的 iPhone 上运行但没有声音 向对象发送 play 会返回成功 并
  • 对象属性的参考行为

    var myObject new Object var myObjectCopy myObject myObject Name alav logs Name alav on both variable console log myObjec
  • 为什么持有自旋锁时不允许“睡眠”? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么持有自旋锁时不能睡觉 https stackoverflow com questions 4752031 why cant you sleep while holding spinlock 据我