0

如果有人对 C++ 有经验,我将不胜感激,多线程代码可以阐明互斥锁问题。它在 Red hat Linux 5.4 上运行。我们正在调试我没有编写的遗留代码。假设每秒执行非常高的调用,响应时间为 3-5 毫秒。我们在主应用程序中运行了大约 400 个线程。

我不喜欢这个应用程序的一件事是在任何地方都使用智能指针(只要 SPtr 超出范围,就会调用互斥锁)。写这篇文章的人似乎对 SPtrs 上瘾了。许多函数都将 SPtr 作为参数。

应用程序可以正常运行几个小时,然后我们在锁定时突然得到互斥体 EINVAL(返回代码 22)。我见过核心转储,它显示了不同的堆栈跟踪,没有一个地方导致它。

你会推荐什么工具来调试这个?这可能是由于内存或堆栈损坏(意味着与互斥锁无关的事情)而发生的吗?谢谢你的时间。

4

1 回答 1

2

EINVALon a pthread_mutex_lockcall 意味着锁没有被正确初始化。这也可能意味着锁已被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 字段表示互斥体已被破坏。0、1 或 2 的种类字段表示有效的互斥锁。其他字段都应该包含小整数或有效的指针。如果你看到随机的垃圾,这意味着互斥锁可能被某些东西破坏了。

于 2013-03-03T20:02:15.877 回答