如何在linux中配置pthread互斥?

我想知道如何配置pthread互斥锁以查看我的代码中是否存在任何锁定争用点。 (谁喜欢有争议的代码,对吧?:)我知道如何对代码进行更全面的分析,正如我在这里提到的那样。 但我想知道是否有任何工具或选项可用于配置互斥锁定,这将提供有关互斥锁定争用的指标/统计数据,以查看我是否有任何问题区域。

这是一些背景和背景:

最近我使用Cavium Octeon CPU开发了一个嵌入式C ++项目。 Octeon SDK使用自旋锁实现互斥式样式同步。 通过Octeon文档,我发现了一种分析自旋锁的方法,以便能够看到每个自旋锁在等待锁变为可用时必须旋转多少次。 要使用它,我必须进行条件编译,然后每次自旋锁旋转时它会增加一个计数器,然后我可以查询微调器等待值。 所以,我所做的是封装自旋锁并添加了为系统中使用的所有自旋锁转储自旋锁微调器等待值的function。 实际值并没有多大意义,但有一些与其他人相比具有非常高的价值,我专注于减少对这些人的争论。

我知道这对于自旋锁来说可能相当容易,因为它只是每次旋转一个计数器,但通过相关的pthread手册页和头文件读取我没有找到类似的东西,是否有可用于pthread互斥锁?

我真的很想避免像每次锁定之前和之后花时间做一些hacky。

PS:互斥体的复数是多少? 互斥,muteces,mutexi,muti ??? 互斥量从来没有对我说话。

valgrind工具drd允许您指定在报告错误之前应等待锁定的时间限制。

这个网站提到了drd并且还提到了他们自己的工具mutrace ,它看起来就像你正在使用的那种工具。 它告诉你:

  • 互斥锁被锁定的次数
  • 互斥锁拥有线程改变了多少次
  • 互斥锁争用的次数(在发出锁定请求时已锁定)
  • 关于互斥锁被锁定的持续时间的各种统计数据

例如

 mutrace: 10 most contended mutexes: Mutex # Locked Changed Cont. tot.Time[ms] avg.Time[ms] max.Time[ms] Type 35 368268 407 275 120,822 0,000 0,894 normal 5 234645 100 21 86,855 0,000 0,494 normal 26 177324 47 4 98,610 0,001 0,150 normal 19 55758 53 2 23,931 0,000 0,092 normal 53 106 73 1 0,769 0,007 0,160 normal 25 15156 70 1 6,633 0,000 0,019 normal 4 973 10 1 4,376 0,004 0,174 normal 75 68 62 0 0,038 0,001 0,004 normal 9 1663 52 0 1,068 0,001 0,412 normal 3 136553 41 0 61,408 0,000 0,281 normal ... ... ... ... ... ... ... ... mutrace: Total runtime 9678,142 ms. 

你没有提到你的操作系统。 如果它是linux,我在这种分析中使用了LTT 。 它有两种模式:

  1. 性能分析 – 例如,将系统分析为标准使用N秒,然后分析数据

  2. exception分析 – 例如,在“飞行记录器”模式下全天候运行(记录活动的最后N秒),并在某些exception情况下触发对飞行记录器的停止。 第二天早上来分析数据。

我一直在使用和看到’互斥体’作为复数互斥多年,现在没有抱怨。 ;>

您可能还希望尝试使用英特尔VTune。 它会报告每个同步原语的等待时间和等待计数以及调用堆栈。 查看此文档,了解这是否是您正在寻找的内容http://software.intel.com/sites/products/documentation/hpc/amplifierxe/en-us/2011Update/lin/start/analyzing_locks_linux.pdf

我在探索相同的用例时发现了’mutrace’ 。 我虽然没有使用它。 它听起来不错,因为它不会像valgrind那样影响运行时。