Pthread Mutex:pthread_mutex_unlock() 消耗大量时间

2024-07-04

我用pthread编写了一个多线程程序,使用生产者-消费者模型。

当我使用 Intel VTune profiler 来分析我的程序时,我发现生产者和消费者在 pthread_mutex_unlock 上花费了大量时间。我不明白为什么会这样。我认为线程可能会等待很长时间才能获取互斥体,但是释放互斥体应该很快,对吗?

下面的快照来自 Intel VTune。它显示了消费者尝试从缓冲区获取项目的代码,以及每个代码行消耗的时间。

My question is that why pthread_mutex_unlock has such overhead? Is the problem with pthread mutex itself or with the way I use it? enter image description here


The pthread_mutex_unlock()函数应释放互斥体引用的互斥体对象。但是,释放互斥锁的方式取决于互斥锁的类型属性。如果在以下情况下,互斥体引用的互斥体对象上有线程被阻塞pthread_mutex_unlock()被调用,导致互斥体变得可用,调度策略应确定哪个线程应获取互斥体。

如果互斥体类型是PTHREAD_MUTEX_NORMAL,不应提供死锁检测。尝试重新锁定互斥锁会导致死锁。如果线程尝试解锁尚未锁定的互斥锁或已解锁的互斥锁,则会导致未定义的行为。

如果互斥体类型是PTHREAD_MUTEX_ERRORCHECK,则应提供错误检查。如果线程尝试重新锁定已锁定的互斥体,则应返回错误。如果线程尝试解锁尚未锁定的互斥体或已解锁的互斥体,则应返回错误。

如果互斥体类型是PTHREAD_MUTEX_RECURSIVE,那么互斥锁应保留锁计数的概念。当线程第一次成功获取互斥锁时,锁计数应设置为 1。每次线程重新锁定该互斥体时,锁定计数应加一。每次线程解锁互斥体时,锁定计数应减一。当锁计数达到零时,互斥锁将可供其他线程获取。如果线程尝试解锁尚未锁定的互斥体或已解锁的互斥体,则应返回错误。

如果互斥体类型是PTHREAD_MUTEX_DEFAULT,尝试递归锁定互斥体会导致未定义的行为。如果调用线程未锁定互斥锁,则尝试解锁该互斥锁会导致未定义的行为。如果互斥锁未锁定,则尝试解锁该互斥锁会导致未定义的行为。

我通常更喜欢使用PTHREAD_MUTEX_RECURSIVE互斥锁,因为在这种情况下,当计数达到零并且调用线程不再对此互斥锁具有任何锁定时,互斥锁将变得可用。

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

Pthread Mutex:pthread_mutex_unlock() 消耗大量时间 的相关文章

  • BoundedSemaphore 在 KeyboardInterrupt 上挂起在线程中

    如果在尝试获取信号量时引发 KeyboardInterrupt 则尝试释放同一信号量对象的线程将无限期挂起 Code import threading import time def worker i sema time sleep 2 p
  • 从 SynchronizationContext 派生

    简而言之 我实现了一个从 SynchronizationContext 派生的类 以便 GUI 应用程序可以轻松地使用 GUI 线程以外的线程上引发的事件 我非常感谢对我的实施提出评论 具体来说 有什么是您建议反对的或可能会导致我未预见到的
  • 限制执行第三方软件的线程的权限

    我正在开发一个基于 Eclipse 的应用程序 能够执行第三方组件 不是 eclipse plugin 每个组件都有一个列出权限 以及相应动机 的自定义描述符 这样最终用户可以决定是否执行它 组件在单独的线程中执行 如何根据描述符限制这些线
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • 使用线程时的套接字问题

    闲暇时我一直在做一个python游戏 遇到了一个问题 我正在使用基本线程模块来处理套接字 当我使用一个客户端连接到服务器文件时 它工作正常 但更重要的是 在第一个之后的任何连接都会冻结服务器和第一个客户端 这是服务器的代码 import s
  • 如何在另一个线程仍在运行时停止主线程

    我在 main 方法中启动了 t1 线程 并想停止主线程 但我的 t1 线程仍在运行 有可能的 如何 public static void main String args Thread t1 new Thread public void
  • 执行类的成员函数

    我正在尝试以一种方式试验 C 11 线程 它接受类的成员函数作为线程构造函数的参数 如下面第 20 行标记为 的第一个代码片段所示 类定义在第二个代码片段中给出 编译此代码时 我收到第三个片段中显示的一堆错误 谁能告诉我我做错了什么 谢谢
  • NotificationObject 的调度程序

    我有 2 个用作视图模型的 NotificationObject 对象 第一个NotificationObject包含绑定到特定控件的视图的属性 第二个NotificationObject具有一些使用Thread对象在另一个线程中执行的代码
  • 计时器计划与scheduleAtFixedRate?

    public class MyTimerTask extends TimerTask Override public void run int i 0 try Thread sleep 100000 catch InterruptedExc
  • 单线程应用程序是否只运行在一个CPU上

    我正在一台 8 CPU 机器上开发一个单线程应用程序 当发生繁重操作时 CPU 利用率如下所示 NET 框架是否有一些工具可以将单个线程的工作 自动 分配给其他 CPU 不保证任何单个线程始终在同一核心上运行 但保证只能在一个核心上运行同时
  • Java:多线程和UDP套接字编程

    我是 Java 多线程和套接字编程的新手 我想知道实现 2 个线程的最佳方法是什么 一个用于接收套接字 一个用于发送套接字 如果我想做的事情听起来很荒谬 请告诉我为什么 该代码很大程度上受到 Sun 在线教程的启发 我想使用多播套接字 以便
  • Java:多线程和UDP套接字编程

    我是 Java 多线程和套接字编程的新手 我想知道实现 2 个线程的最佳方法是什么 一个用于接收套接字 一个用于发送套接字 如果我想做的事情听起来很荒谬 请告诉我为什么 该代码很大程度上受到 Sun 在线教程的启发 我想使用多播套接字 以便
  • ManualResetEvent WaitOne 未解锁

    我对我正在使用的 ManualResetEvent 有点困惑 它似乎没有解锁 有谁知道为什么会出现这种情况 我得到的场景就是这样的 真实的情况相当复杂 我还没有成功地隔离出一段可以合理发布来重现问题的代码 EDIT我更新了下面的代码示例 这
  • 在编写任何锁之前我应该​​对多线程问题进行单元测试吗?

    我正在编写一个我知道需要锁的类 因为该类必须是线程安全的 但由于我是测试驱动开发 我知道在为其创建测试之前我无法编写一行代码 我发现很难做到 因为测试最终会变得非常复杂 在这些情况下你通常会做什么 有什么工具可以帮助解决这个问题吗 这个问题
  • 高CPU,可能是由于上下文切换?

    我们的一台服务器的应用程序的 CPU 负载非常高 我们查看了各种统计数据 但在寻找问题根源时遇到了问题 当前的理论之一是涉及的线程太多 我们应该尝试减少并发执行线程的数量 只有一个主线程池 有 3000 个线程 以及一个与之一起工作的 Wo
  • 被杀死的进程/线程会释放互斥锁吗?

    多个进程访问共享内存 并使用互斥体锁定它pthread mutex lock 为了同步 每个进程都可以随时被杀死 事实上我描述过php fpm with APC扩展 但这并不重要 如果进程锁定互斥锁然后被杀死 互斥锁会自动解锁吗 或者有什么
  • 如何在多线程中使用spring事务

    我有一个方法如下 ClassA java Transactional public void methodA ExecutorService executorService Executors newFixedThreadPool 4 ex
  • Pthread Mutex:pthread_mutex_unlock() 消耗大量时间

    我用pthread编写了一个多线程程序 使用生产者 消费者模型 当我使用 Intel VTune profiler 来分析我的程序时 我发现生产者和消费者在 pthread mutex unlock 上花费了大量时间 我不明白为什么会这样
  • 如何在完成另一个线程后运行一个线程

    我想运行两个线程r1 and r2 首先启动r1并完成后r1 start r2 仅在完成后r1 这怎么能做到呢 两个线程 一个接着一个 我的答案here https stackoverflow com questions 4592716 m

随机推荐

  • SurfaceView 将视频播放为拉伸视图

    我正在使用 mediaplayer xml 来播放视频文件
  • 防止图像在每次状态更改时重新渲染 - React

    在我的组件中 我按以下方式使用了图像 div span img src spinner span span We are checking your details span div 这是一个包含许多状态的大型功能组件中的几行代码 该组件有
  • 如何在没有 iframe 的情况下使用 Google 表单?

    几年前 我在互联网上发现如何在联系页面中使用 Google 表单 仅使用属性提交按钮操作中的查询而不使用 iframe 现在 我再也找不到了 没有 iframe 是否仍然可以使用 Google 表单 我刚刚找到了 function post
  • 使用 ExitThread 关闭线程 - C

    我有一个简单的程序 它创建一个线程 循环二十次 然后调用关闭自身并执行必要的清理 当我调试程序时 它到达 ExitThread 方法并暂停 忽略 printf 我已经在它之后设置了向我发出关闭信号的信号 这是正常现象还是我忘记做某事 我是使
  • rails-created_at 当用户订购时,是否应该向表中添加索引?

    您好 我有一张模特照片 default scope order gt photos created at DESC photos version DESC 鉴于我按 CREATED AT 和版本进行排序 我应该在 CREATED AT 上有
  • Python:使用带有整数键的 dict() 创建字典?

    在 Python 中 我看到人们创建这样的字典 d dict one 1 two 2 three 3 如果我的键是整数怎么办 当我尝试这个时 d dict 1 1 2 2 3 3 我收到一个错误 我当然可以这样做 d 1 1 2 2 3 3
  • C# WPF 如何从字节数组加载 FontFamily?

    嗯 我基本上想从字面上嵌入我将在 WPF 应用程序中使用的字体集合 它们存储在我自己的虚拟文件系统 如 WinRAR 中 我只想通过字节数组或内存流加载它们 但是 我还没有找到任何可行的解决方案 我尝试过 PrivateFontCollec
  • RestoreCompletedTransactions() 没有调用 paymentQueue UpdatedTransactions?

    我在 Swift 4 iOS 11 中恢复 IAP 时遇到问题 我的AppDelegate实施SKPaymentTransactionObserver In AppDelegate s didFinishLaunchingWithOptio
  • 如何绕过浏览器每个域 6 个并发连接的限制?

    正如标题所述 如何绕过浏览器每个域 6 个连接的限制 我有一个网络应用程序 需要尽快从服务器下载数据 目前 我一次打开了大约十几个连接 但在网络选项卡中我看到其中几个连接是stalled 铬 或blocked Firefox 显示为灰色 经
  • 是否可以设计一棵节点具有无限多个子节点的树?

    如何设计一棵具有大量 无限数量 分支的树 我们应该使用哪种数据结构来存储子节点 您实际上无法存储无限多个子项 因为这不适合内存 但是 您可以存储无限地许多子节点 也就是说 您可以创建树 其中每个节点可以有任意数量的子节点 没有固定的上限 有
  • 是否可以制作固定的评级栏?

    我正在从网络上获取评级 并希望通过评级栏显示评级 但我的问题是 当我滑动评级栏时 评级栏的评级会发生变化 我希望评级是固定的 并且不会因用户的触摸而改变 有人可以限制对评级栏的控制吗 我怎样才能做到这一点 Use android isInd
  • 使用 SUM() 而不使用 ISNULL() 是否安全

    我正在努力提高 SP 的性能 我对 SUM 和 ISNULL 有疑问 当我对一列求和时 我应该使用 ISNULL 吗 使用不带 ISNULL 的 SUM 安全吗 我的例子如下 SUM ISNULL COL1 0 由于 ISNULL 成本很高
  • 如何修复 Linux 上 npm 上的连接 ENETUNREACH

    我没有使用代理 我只是一个试图学习如何开发的菜鸟create react app在我的机器本地 linux 这是的输出tracepath registry npmjs org 1 LOCALHOST 0 020ms pmtu 1500 1
  • 调整大小然后裁剪 PHP

    好的 基本上我希望所有图像都是 170x170px 的正方形 因此 如果图像不是正方形 我希望调整它的大小 然后在中间裁剪 我花了很多时间玩这个 但一无所获 我已经让它裁剪较大图像的一部分等 但我特别需要调整图像大小 然后裁剪 任何帮助将不
  • AWS Elastic Beanstalk:推出新的 Rails 应用程序

    I just started using AWS elastic beanstalk to host a web app I wanted to make However after following the instructions t
  • C# 真的比 C++ 慢吗?

    我想知道这个问题有一段时间了 当然 C 中的某些内容未针对速度进行优化 因此使用这些对象或语言调整 如 LinQ 可能会导致代码变慢 但是 如果您不使用任何这些调整 而只是比较 C 和 C 中的相同代码片段 很容易将一种代码转换为另一种代码
  • 具有负方差的混合效应模型

    我知道这是一个有点老的问题 但我只是想知道现在是否有解决方案 我通常执行混合效应模型lme4封装有lmer功能 但是 我知道这个函数不允许我在模型中包含负方差分量 我真的很想在 R 模型中包含负方差 有没有人对我会使用哪些包有任何建议 或者
  • Java:是否有可用的工具可以让我输入、存储和计算数学公式?

    即使是非常基本的东西也很好 就像输入和评估类似 x 1 的东西一样 其中 x 是我要指定的变量 我正在考虑为每个公式使用字符串 用于解析它们的正则表达式等来编写自己的代码 但是让我们假设我的目标是尽可能地懒惰 并且如果有另一种选择 尤其是正
  • 如何在android中实现按钮的非矩形形状

    hi i have to realize this layout it has this layout 我可以尝试使用图标作为图像按钮 但按钮的活动状态有点像这个 我应该如何进行 你应该使用selector如下 准备2张按钮状态图片 放入r
  • Pthread Mutex:pthread_mutex_unlock() 消耗大量时间

    我用pthread编写了一个多线程程序 使用生产者 消费者模型 当我使用 Intel VTune profiler 来分析我的程序时 我发现生产者和消费者在 pthread mutex unlock 上花费了大量时间 我不明白为什么会这样