【发布时间】:2013-03-04 05:39:48
【问题描述】:
如果有人使用过 C++,多线程代码可以阐明互斥锁问题,我将不胜感激。它在 Red hat Linux 5.4 上运行。我们正在调试我没有编写的遗留代码。假设每秒执行非常高的调用,响应时间为 3-5 毫秒。我们在主应用程序中运行了大约 400 个线程。
我不喜欢这个应用程序的一点是在任何地方都使用智能指针(只要 SPtr 超出范围,就会调用互斥锁)。写这篇文章的人似乎对 SPtrs 上瘾了。很多函数都将 SPtr 作为参数。
应用程序可以正常运行几个小时,然后我们在锁定时突然得到互斥体 EINVAL(返回码 22)。我见过核心转储,它显示不同的堆栈跟踪,没有一个地方导致它。
您会推荐什么工具来调试它?这可能是由于内存或堆栈损坏(意味着与互斥锁无关的事情)而发生的吗?感谢您的宝贵时间。
【问题讨论】:
-
试用 valgrind,使用 helmgrind 工具和默认工具。
-
400 个线程在工作?还是在读取系统调用时被阻止?
-
Sam,应用程序的输入是每毫秒 1 次调用 (1000 cps)。调用被发送到另一个与数据库对话的应用程序 (tcp)。然后响应返回并发送回调用者。这是 VoIP 应用程序。因此,为了回答您的问题,线程正忙于处理传入信息或传出信息(未阻塞)。
-
柔印,valgrind 和 hlgrind 看起来很有前途。我会试试看。现在他们甚至无法在所有线程都优雅退出的应用程序中进行体面的关闭。如果需要重新启动,他们只会终止应用程序。我正在输入代码以正确关闭(valgrind 需要它)。
标签: c++ linux multithreading mutex