C++ 无法确定谁调用lock\u wait
我有一个多线程应用程序。我可以设置要运行的线程数(简单数据并行)。当尝试使用超过4个线程运行它时,我看到性能显著下降。探查器显示分别由C++ 无法确定谁调用lock\u wait,c++,linux,multithreading,profiling,perf,C++,Linux,Multithreading,Profiling,Perf,我有一个多线程应用程序。我可以设置要运行的线程数(简单数据并行)。当尝试使用超过4个线程运行它时,我看到性能显著下降。探查器显示分别由\u L\u unlock\u 532和调用的\u llu unlock\u wake和\u llu lock\u wait消耗的大量时间。我怀疑堆操作上存在锁,因为每个线程都分配和释放大量数据 问题是,任何经过测试的探查器(perf,google的pperf)都不会在\u L_lock\u 926上显示调用者,因此我无法检查我的函数是否导致了此锁定。我想使用一些
\u L\u unlock\u 532
和调用的\u llu unlock\u wake
和\u llu lock\u wait
消耗的大量时间。我怀疑堆操作上存在锁,因为每个线程都分配和释放大量数据
问题是,任何经过测试的探查器(perf,google的pperf)都不会在\u L_lock\u 926
上显示调用者,因此我无法检查我的函数是否导致了此锁定。我想使用一些内存池技术来减少堆操作的数量,但我不想在每次数据收集时都这样做。有没有办法增加此函数的调用堆栈深度
预期建议:
- 我已经用“-fno省略帧指针”编译了代码
- 谷歌的tcmalloc似乎帮不上忙
- 我不能使用
fork()
,因为我的应用程序也需要在windows上运行
是-请链接器将默认堆栈分配设置为更大的值,或者显式地使用更大的堆栈创建线程。“任何已测试的探查器”还有其他:gprof
,callgrind
,oprofile
等等。callgrind
仅为我显示用户空间代码,perf
和perf-g dwarf
显示了相同的信息,所以我不认为这是一个探查器错误。您使用调试信息编译并使用perf
调用图录制吗?@EOF-是的,我使用perf-record-g my_app运行它