Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RH-Linux互斥锁调试 如果有人使用C++,多线程代码可以减轻互斥问题,我会很感激。它运行在Red hat Linux 5.4上。我们正在调试我没有编写的遗留代码。假设它每秒进行非常高的呼叫,响应时间为3-5毫秒。我们在主应用程序中运行大约400个线程_C++_Linux_Multithreading_Mutex - Fatal编程技术网

RH-Linux互斥锁调试 如果有人使用C++,多线程代码可以减轻互斥问题,我会很感激。它运行在Red hat Linux 5.4上。我们正在调试我没有编写的遗留代码。假设它每秒进行非常高的呼叫,响应时间为3-5毫秒。我们在主应用程序中运行大约400个线程

RH-Linux互斥锁调试 如果有人使用C++,多线程代码可以减轻互斥问题,我会很感激。它运行在Red hat Linux 5.4上。我们正在调试我没有编写的遗留代码。假设它每秒进行非常高的呼叫,响应时间为3-5毫秒。我们在主应用程序中运行大约400个线程,c++,linux,multithreading,mutex,C++,Linux,Multithreading,Mutex,这个应用程序有一点我不喜欢,那就是在任何地方都使用智能指针(只要SPtr超出范围,就会有互斥调用)。写这篇文章的人似乎对SPTR上瘾了。许多函数都将SPtr作为参数 应用程序可以正常运行几个小时,然后我们在锁定时突然获得互斥体EINVAL(返回代码22)。我见过内核转储,它显示了不同的堆栈跟踪,没有一个地方导致它 您建议使用什么工具来调试此文件?这种情况是否会由于内存或堆栈损坏(意味着与互斥无关的内容)而发生?感谢您的时间。pthread\u mutex\u lock调用上的EINVAL表示锁未

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

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


您建议使用什么工具来调试此文件?这种情况是否会由于内存或堆栈损坏(意味着与互斥无关的内容)而发生?感谢您的时间。
pthread\u mutex\u lock
调用上的EINVAL表示锁未正确初始化。这也可能意味着锁已被
pthread\u mutex\u 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
}
$5={
__数据={
__lock=0,
__计数=0,
__所有者=0,
__努瑟斯=0,
__种类=-1,
__自旋=0,
__列表={
__prev=0x0,
__next=0x0
}
}, 
__大小=“\000”\377、\377\377\377”、“\000”,
__对齐=0
}

在这种情况下,
kind
字段为-1表示互斥已被销毁。0、1或2的种类字段表示有效的互斥量。其他字段都应该包含小整数或有效的指针。如果您看到随机的垃圾,这意味着互斥锁可能被什么东西破坏了。

尝试valgrind,使用helgrind工具以及默认的1.400线程工作?或在读取系统调用时被阻止?你们看了吗?山姆,应用程序的输入是每毫秒1次呼叫(1000次)。这些调用被发送到另一个与数据库对话的应用程序(tcp)。然后响应返回并发送回调用者。这是VoIP应用程序。因此,为了回答您的问题,线程正在忙于处理传入信息或传出信息(未被阻止)。我会试试看。现在他们甚至无法在所有线程都无法正常退出的情况下关闭应用程序。如果需要重新启动,它们只会杀死应用程序。我正在输入代码以正确关机(valgrind需要它)。Chris,谢谢。我将使用valgrind来确保任何与内存相关的问题出现并得到解决。如果互斥对象种类字段的值不是-1,0,1,2,则可能可以将gdb设置为停止。这是我不知道的有趣信息。