如果有人对C++、多线程代码有经验,能对互斥问题有所了解,我将不胜感激。它运行在Red hat Linux 5.4上。我们正在调试不是我写的遗留代码。假设每秒进行非常高的调用,响应时间为3-5毫秒。我们在主应用程序中运行了大约400个线程。
我不喜欢这个应用程序的一个地方是到处使用智能指针(当SPtr超出范围时就会调用互斥锁)。写这篇文章的人似乎对SPtrs上瘾了。许多函数都将SPtr作为参数。
应用程序可以正常运行几个小时,然后我们在锁的时候突然得到互斥EINVAL (返回代码22)。我见过核心转储,它显示了不同的堆栈跟踪,没有一个地方导致它。
你会推荐什么工具来调试它?这是否会由于内存或堆栈损坏(意味着与互斥锁无关的东西)而发生?耽误您时间,实在对不起。
发布于 2013-03-04 04:02:16
pthread_mutex_lock调用中的EINVAL表示锁尚未正确初始化。这也可能意味着锁已被pthread_mutex_destroy销毁。如果您有内存或堆栈损坏--如果您用随机垃圾覆盖了互斥对象,或者您试图在调用互斥对象的析构函数之后将其与互斥对象一起使用,则会发生上述两种情况。
如果在gdb中打印互斥对象,您将看到类似以下内容:
$5 = {
__data = {
__lock = 0,
__count = 0,
__owner = 0,
__nusers = 0,
__kind = -1,
__spins = 0,
__list = {
__prev = 0x0,
__next = 0x0
}
},
__size = '\000' <repeats 16 times>"\377, \377\377\377", '\000' <repeats 19 times>,
__align = 0
}在本例中,kind字段为-1表示互斥锁已被销毁。Kind字段0、1或2表示有效的互斥锁。其他字段都应该包含小整数或有效的查找指针。如果你看到随机的垃圾,这意味着互斥量可能被什么东西破坏了。
https://stackoverflow.com/questions/15188052
复制相似问题