Linux 如何找到信号量未锁定的原因

Linux 如何找到信号量未锁定的原因,linux,ipc,deadlock,semaphore,Linux,Ipc,Deadlock,Semaphore,我有一个特殊的情况,有两个线程(实际上是5个线程)挂起。原因是它正在等待一个信号量,并且无法获取该信号量。 ipcs-p不显示任何具有该信号量的任务。 ipcs-s-i显示计数为5 那么,我如何知道为什么这5个线程没有发生信号量锁呢?如何查看是否有线程持有此信号量 (在分析调用堆栈时,我看不到任何具有该信号量的任务。) 谢谢你的帮助 我将围绕信号量的使用编写一些调试代码(即,在每个信号量函数之前和之后,指定使用哪个信号量和哪个线程)。此外,我会再次检查,以确保您的代码没有任何死锁。这很容易实现,

我有一个特殊的情况,有两个线程(实际上是5个线程)挂起。原因是它正在等待一个信号量,并且无法获取该信号量。 ipcs-p不显示任何具有该信号量的任务。 ipcs-s-i显示计数为5

那么,我如何知道为什么这5个线程没有发生信号量锁呢?如何查看是否有线程持有此信号量

(在分析调用堆栈时,我看不到任何具有该信号量的任务。)


谢谢你的帮助

我将围绕信号量的使用编写一些调试代码(即,在每个信号量函数之前和之后,指定使用哪个信号量和哪个线程)。此外,我会再次检查,以确保您的代码没有任何死锁。这很容易实现,确保以相同的顺序使用各种信号量来获得互斥锁,并以相反的顺序释放锁


除此之外,如果没有代码,我几乎不能给您任何帮助。

我会围绕信号量的使用编写一些调试代码(即,在每次调试之前和之后,都会向那些信号量函数指定正在使用的信号量和线程)。此外,我会再次检查,以确保您的代码没有任何死锁。这很容易实现,确保以相同的顺序使用各种信号量来获得互斥锁,并以相反的顺序释放锁


除此之外,如果没有代码,我几乎不能给您任何帮助。

您是否正在检查每个与信号量相关的系统调用的错误?(semop、semget等)IIRC、EINTR errno及其相关信号必须正确处理,否则可能会死锁。在本世纪初,我经常使用Informix+Tuxedo。我们正在检查返回代码。但是,这是遗留代码,我需要详细访问这段代码以查看任何可能的错误您是否在检查每个与信号量相关的系统调用的错误?(semop、semget等)IIRC、EINTR errno及其相关信号必须正确处理,否则可能会死锁。在本世纪初,我经常使用Informix+Tuxedo。我们正在检查返回代码。但是,这是遗留代码,我需要详细访问此代码以查看任何可能的错误。此特定信号量由4个轮询器线程使用,在HW访问之前由一个主线程使用。因此,这是调用的端点。因此,在此之后不会有其他sem/互斥调用。此外,由于它使用0.5秒和1秒轮询器,因此添加一些打印是不可行的,并且会推迟计时,因为这不会发生问题。当然,在调用堆栈中分析(如OP中所述)会推迟计时。写一些在某种程度上模拟它失败的硬件的东西,并将该部分作为测试用例执行,怎么样?这个特定的信号量由4个轮询器线程使用,在硬件访问之前由一个主线程使用。因此,这是调用的端点。因此,在此之后不会有其他sem/互斥调用。此外,由于它使用0.5秒和1秒轮询器,因此添加一些打印是不可行的,并且会推迟计时,因为这不会发生问题。当然,在调用堆栈中分析(如OP中所述)会推迟计时。写一些在某种程度上模拟失败的硬件的东西,并将其作为测试用例执行,怎么样?