锁定和解锁互斥体的效率如何?互斥体的成本是多少?

2023-12-04

在低级语言(C、C++ 或其他语言)中:我可以选择使用一堆互斥体(如 pthread 提供的或本机系统库提供的任何内容)或对象的单个互斥体。

锁定互斥体的效率如何? IE。可能有多少条汇编指令以及它们需要多少时间(在互斥体解锁的情况下)?

互斥体的成本是多少?真的有问题吗a lot互斥体?或者我可以在代码中添加尽可能多的互斥变量吗int变量并不重要?

(我不确定不同硬件之间有多少差异。如果有的话,我也想了解它们。但大多数情况下,我对通用硬件感兴趣。)

关键是,通过使用许多互斥体,每个互斥体仅覆盖对象的一部分,而不是整个对象的单个互斥体,我可以保护许多块。我想知道我应该在这件事上走多远。 IE。我是否应该尝试尽可能地保护任何可能的块,无论这意味着多么复杂以及多少互斥体?


关于锁定的 WebKits 博客文章 (2016)与这个问题非常相关,并解释了自旋锁、自适应锁、futex等之间的区别。


我可以选择使用一堆互斥体或为一个对象使用一个互斥体。

如果你有很多线程并且对对象的访问经常发生,那么多个锁会增加并行性。以可维护性为代价,因为更多的锁定意味着更多的锁定调试。

锁定互斥体的效率如何? IE。可能有多少汇编指令以及它们需要多少时间(在互斥锁未锁定的情况下)?

精确的汇编指令是最少的开销a mutex - 内存/缓存一致性担保是主要的开销。并且更少地使用特定的锁 - 更好。

互斥体由两个主要部分组成(过于简单化):(1)指示互斥体是否锁定的标志和(2)等待队列。

标志的更改只需几条指令,通常无需系统调用即可完成。如果互斥量被锁定,系统调用将发生将调用线程添加到等待队列并开始等待。如果等待队列为空,则解锁很便宜,但否则需要系统调用来唤醒等待进程之一。 (在某些系统上,廉价/快速的系统调用用于实现互斥体,只有在发生争用的情况下它们才会变成慢速(正常)系统调用。)

锁定未锁定的互斥量确实很便宜。解锁互斥锁而不发生争用也很便宜。

互斥体的成本是多少?拥有大量互斥锁会带来问题吗?或者我可以在代码中抛出与 int 变量一样多的互斥变量,但这并不重要?

您可以根据需要在代码中添加任意数量的互斥变量。您仅受应用程序可以分配的内存量的限制。

概括。用户空间锁(尤其是互斥体)很便宜并且不受任何系统限制。但它们太多会给调试带来噩梦。简单表格:

  1. 更少的锁意味着更多的争用(缓慢的系统调用、CPU 停顿)和更少的并行性
  2. 更少的锁意味着调试多线程问题的问题更少。
  3. 更多的锁意味着更少的争用和更高的并行性
  4. 更多的锁意味着更多的机会陷入不可调试的死锁。

应该找到并维护应用程序的平衡锁定方案,通常平衡#2 和#3。


(*) 很少被锁定的互斥体的问题是,如果您的应用程序中有太多锁定,则会导致大量 CPU/核心间流量从其他 CPU 的数据缓存中刷新互斥体内存,以保证缓存一致性。缓存刷新就像轻量级中断并由 CPU 透明地处理 - 但它们确实引入了所谓的stalls(搜索“摊位”)。

停顿是导致锁定代码运行缓慢的原因,通常没有任何明显的迹象表明应用程序运行缓慢。 (有些架构提供 CPU/核心间的流量统计信息,有些则不提供。)

为了避免这个问题,人们通常采用大量的锁来减少锁争用的可能性并避免停顿。这就是为什么存在不受系统限制的廉价用户空间锁定的原因。

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

锁定和解锁互斥体的效率如何?互斥体的成本是多少? 的相关文章

  • 在 Three.js 中从 Web Worker 加载纹理

    当将大纹理图像应用到网格上一段明显的时间时 Three js 会锁定浏览器的主线程 让我们考虑以下示例 var texLoader new THREE TextureLoader texLoader load someLargeTextur
  • 如何通过start-stop-daemon正常关闭Spring Boot应用程序[重复]

    这个问题在这里已经有答案了 我们有一个多线程 Spring Boot 应用程序 它作为守护进程在 Linux 机器上运行 当我尝试像这样通过启动停止守护进程停止应用程序时 start stop daemon stop quiet retry
  • 如何使用 wait() 和 notification() 正确暂停线程

    我想要一个启动线程并提供暂停和继续该线程的方法的类 我的第一个方法是使用标志 只要该值为 true 它就会循环 sleep 方法 就像是 public class Bot private Thread t private boolean i
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • Python 2.7:支持一个端口上多个连接的流式 HTTP 服务器

    我正在寻找一个标准的Python 2 7包 提供一个同时执行的HTTP服务器流媒体同一端口号上的连接 嘿 各位版主 请停止将我的问题标记为想要以非流媒体方式提供服务的问题的重复项 例如 python 中的多线程 Web 服务器 https
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • Erlang 如何睡觉(晚上?)

    我想在 Erlang 服务器上每隔几个小时运行一次小型清理过程 我知道计时器模块 我在教程中看到一个示例 使用链式计时器 睡眠命令来等待几天后发生的事件 我觉得这很奇怪 我知道 Erlang 进程与其他语言中的进程相比是独一无二的 但是进程
  • 异步回调在哪个线程上运行?

    我正在做几个HttpWebRequest BeginGetResponse调用 并在回调方法中BeginGetResponse 我正在调用一个事件处理程序 在EventHandler中 有测试下载是否成功的逻辑 如果没有 它会尝试重新下载
  • 多线程Spring-boot控制器方法

    因此 我的应用程序 spring boot 运行速度非常慢 因为它使用 Selenium 来抓取数据 处理数据并显示在主页中 我遇到了多线程 我认为它对我的应用程序很有用 可以让它运行得更快 但是教程似乎显示在带有 main c 的普通 j
  • 这是 C# 的有效、惰性、线程安全的 Singleton 实现吗?

    我实现了这样的单例模式 public sealed class MyClass public static MyClass Instance get return SingletonHolder instance static class
  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • VB - 以隐式方式链接 DLL

    我正在开发 VB6 图形界面 并且需要隐式链接到 DLL 这样做的动机来自于我上一个问题 https stackoverflow com questions 5194573 有问题的 DLL 使用静态 TLS declspec thread
  • 赋值运算符“=”是原子的吗?

    我正在使用全局变量实现线程间通信 global var volatile bool is true true thread 1 void thread 1 while 1 int rint rand 10 if is true cout l
  • 父子进程之间的通信

    我正在尝试创建一个具有一个或多个子进程的 Python 3 程序 父进程生成子进程 然后继续处理自己的业务 有时我想向特定的子进程发送一条消息 由其捕获该消息并采取行动 此外 子进程在等待消息时需要处于非锁定状态 它将运行自己的循环来维护服
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现

随机推荐

  • 这是在我的程序中嵌入调试消息的好方法吗? (宏)

    在 Debug h 文件中 我有以下内容 ifdef DEBUG FLAG define DEBUG msg std cerr lt lt msg lt lt std endl else define DEBUG msg for true
  • 托管 C# dll 上的 GetProcAddress

    我正在尝试通过 LoadLibrary 加载 C dll 我能够成功加载它 您能告诉我如何使用此 dll 的 GetProcAddress 以便我可以使用此 dll 中定义的方法和类型吗 提前致谢 EDIT 1 解决此问题的最佳方法是 CO
  • Web USB 从设备到浏览器传输数据无法正常工作

    上面是我的设备配置 我正在尝试从中获取数据 我正在使用下面的代码来获取数据 document getElementById request onclick function navigator usb requestDevice filte
  • java httpssession有效吗?

    我在 tomcat 中使用 java servlet API 我将用户名和带有属性用户名的 httpsession 保存在哈希表中 我想知道是否有办法检查 httpsession 是否有效 我试过了 try String user http
  • Google Chrome 错误 - 溢出:自动 |滚动不起作用

    这是我在 Chrome 中的网站 文本在框外运行 这是在 IE 中没有问题 这是相关的CSS section height 1000px width 670px border thick solid rgb 51 97 120 border
  • windows和spyder中的python多处理问题

    我的大学有一个关于 python 多重处理的项目 对于我的 python 项目 我在 Windows 中使用spyder 因此 我尝试在spyder中运行一个非常简单的多处理代码 但每次我运行它时 spyder控制台都会冻结并且永远不会完成
  • 手动为 boost 的图表着色

    我正在努力尝试使用 boost 手动为图的顶点着色 我写了下面的代码 但我不明白为什么生成的文件没有任何颜色 int main int char typedef property
  • 为什么不能在循环中隐藏局部变量?

    我遇到了这种情况 我无法理解阴影 例如下面的代码 class Foo int a 5 void goFoo int a No problem naming parameter as same as instance variable for
  • 构建管道的保存被禁用

    我已经填写了构建管道的所有选项 并且没有错误消息 如何找出 保存 按钮被禁用的原因 如果我转到顶部菜单上的 触发器 那么我可以在 持续集成 下看到一些需要注意的设置 在我的屏幕截图中 红色的小错误图标实际上在 触发器 一词的映衬下可见 您必
  • 在 Razor 邮件模板中使用 @Html.Raw 渲染 HTML 内容

    使用 Razor 页面作为邮件模板我尝试使用显示邮件内容 Html 内容 Html Raw Model Content 每当我运行代码时 我都会收到此错误 html does not exist in current context 我试过
  • 如何获取 CheckboxColumn Gridview 中选定的数据/项目行 - Yii2

    我在使用 checkboxColumn 获取所有选定值 数据 Yii2 Gridview 时遇到问题 我只能得到one of the value in the grid使用此代码 class gt yii grid CheckboxColu
  • 转换器类抛出异常 java.lang.IllegalArgumentException

    我的 JSF 页面中有 p selectOneMenu 当我运行 JSF 页面时 我从 Converter 类中收到以下异常 java lang IllegalArgumentException object 5634 is of type
  • QWidget::find 可以从不同的进程中查找小部件吗?

    的文档QWidget winId状态 除其他外 如果一个小部件是非本机 外星人 并且在其上调用 winId 则将为该小部件提供本机句柄 我不确定 外星人 在这种情况下意味着什么 但我现在选择忽略它 因此 假设我的小部件现在有一个与之关联的有
  • 用于选择发件人和签名的 VBA 代码

    在 Excel 中 我使用如下代码通过 Outlook 开始发送电子邮件 Set mOutlookApp GetObject Outlook application Set OutMail mOutlookApp CreateItem 0
  • iOS/Swift:PFFacebookUtils.logInWithPermissions 返回 nil 用户和错误

    在我的应用程序中 我通过 Parse 的 PFFacebookUtil 类登录用户 如果用户存在于手机上 即在 设置 gt Facebook 中登录 FB 则一切都会按预期进行 但如果他们是未通过设置登录 然后用户被带到 Web 视图进行登
  • 对于 CUDA 的嵌套循环

    我遇到了一些 for 嵌套循环的问题 我必须将其从 C C 转换为 CUDA 基本上我有 4 个 for 嵌套循环 它们共享相同的数组并进行位移操作 define N 65536 int a1 a2 a3 a4 i1 i2 i3 i4 in
  • Firebase Cloud Firestore REST api 身份验证仅使用 WEB API 密钥?

    我正在尝试通过其 REST API 和curl 在 Firebase Cloud Firestore 数据库中插入新记录 由于操作是公开的 因此从数据库中读取数据可以按预期进行 创建操作未在数据库规则中列出 并且仅在服务器端执行 但我无法仅
  • jQuery .hover 不工作

    嗨 我的代码有什么问题 当我将鼠标悬停在 open 上时 pull down content 应该从标题向下移动页面 当我离开 open 时 它应该向上移动 但是 当我在页面加载后测试代码时 pull down content 在我将鼠标悬
  • 如果另一个工作表中存在行值,则删除多个工作表中的行值

    下面的代码来自这个答案post关于将行值复制到新工作表 如果它存在于其他工作表中 现在 如果我不想将重复值复制到工作表 3 而是想从工作表 1 和工作表 2 中删除它们 如果工作表 3 中存在 该怎么办 电子表格 我有3张 将在前两张纸上进
  • 锁定和解锁互斥体的效率如何?互斥体的成本是多少?

    在低级语言 C C 或其他语言 中 我可以选择使用一堆互斥体 如 pthread 提供的或本机系统库提供的任何内容 或对象的单个互斥体 锁定互斥体的效率如何 IE 可能有多少条汇编指令以及它们需要多少时间 在互斥体解锁的情况下 互斥体的成本