如果有人使用C++,多线程代码可以减轻互斥问题,我将感激不尽。它运行在Red hat Linux 5.4上。我们正在调试我没有编写的遗留代码。它的响应时间是3-5毫秒。我们正在主应用程序中运行大约400个线程。
我不喜欢这个应用程序的一个地方是在任何地方使用智能指针(SPtr超出范围时都会有互斥调用)。写这篇文章的人似乎沉迷于SPtrs。很多函数都以SPtr作为参数。
应用程序可以正常运行几个小时,然后在锁定时突然得到互斥体EINVAL(返回代码22)。我见过内核转储,它显示了不同的堆栈跟踪,没有一个地方导致它。
你建议用什么工具来调试?这可能是由于内存或堆栈损坏(意味着一些与互斥无关的东西)造成的吗?谢谢你的时间。

最佳答案

EINVAL调用表示锁未正确初始化。这也可能意味着锁已被pthread_mutex_lock破坏。如果内存或堆栈损坏,或者使用随机垃圾覆盖互斥对象,或者在调用互斥对象的析构函数后尝试将其与互斥对象一起使用,则可能会发生上述情况。
如果在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
}

在本例中,-1的pthread_mutex_destroy字段表示互斥锁已被破坏。0、1或2的种类字段表示有效的互斥量。其他字段都应该包含小整数或有效的指针。如果您看到随机的垃圾,这意味着互斥锁可能被某些东西搞砸了。

09-06 18:55