我想知道如何分析 pthread 互斥锁以查看我的代码中是否存在任何锁定争用点。 (谁喜欢有争议的代码,对吧?:) 我知道如何对代码进行更一般的分析,正如我提到的 here .但我想知道是否有任何工具或选项可用于分析互斥锁,这些工具或选项可以提供有关互斥锁争用的指标/统计信息,以查看我是否有任何问题区域。
这里有一些背景和背景:
最近我使用 Cavium Octeon CPU 从事嵌入式 C++ 项目。 Octeon SDK 使用自旋锁实现互斥锁样式同步。通过查看 Octeon 文档,我发现了一种分析自旋锁的方法,以便能够查看每个自旋锁在等待锁可用时必须旋转多少次。要使用它,我必须进行条件编译,然后每次自旋锁旋转时都会增加一个计数器,然后我可以查询微调器等待值。因此,我所做的是封装自旋锁,并添加了为系统中使用的所有自旋锁转储自旋锁微调器等待值的能力。实际值并没有多大意义,但与其他的相比,有一些具有非常高的值,我专注于减少对它们的争用。
我知道这对于自旋锁来说可能很容易,因为它只是一个每次自旋的计数器,但是通过阅读相关的 pthread 手册页和头文件我还没有找到类似的东西,有没有可用于 pthread 互斥锁的东西?
我真的很想避免做一些不合时宜的事情,比如在每次锁定之前和之后花时间。
PS:mutex 的复数形式是什么?互斥体,互斥体,互斥体,互斥体???互斥体对我来说从来都不是正确的。
最佳答案
valgrind
工具drd允许您指定在报告错误之前应等待锁定的时间限制。
这个 site提到了 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.
关于c++ - 如何在 linux 中分析 pthread 互斥锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852637/