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

Posted

技术标签:

【中文标题】如何找到信号量未锁定的原因【英文标题】:How to find why semaphore is not locking 【发布时间】:2012-05-08 04:53:13 【问题描述】:

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

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

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

感谢您的帮助!

【问题讨论】:

您是否在每个与信号量相关的系统调用上检查错误? (semop、semget 等)IIRC、EINTR errno 和与之相关的信号必须正确处理,否则可能会死锁。在 00 年代初期,我经常使用 Informix + Tuxedo。 我们正在检查返回码。但是,这是遗留代码,我需要详细访问此代码以查看任何可能的错误 【参考方案1】:

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

除此之外,没有代码我能给你的帮助很少。

【讨论】:

这个特定的信号量被 4 个轮询线程和一个主线程在硬件访问之前使用。因此,这是呼叫的一种端点。因此,在此之后没有其他 sem/mutex 调用。 另外,由于它使用 0.5 和 1 秒的轮询器,因此添加一些打印是不可行的,并且会影响不会发生问题的时间。 肯定分析调用堆栈(如 OP 中所述)会引发时间问题。编写一些在某种程度上模拟失败的硬件并将该部分作为测试用例执行的东西怎么样?

以上是关于如何找到信号量未锁定的原因的主要内容,如果未能解决你的问题,请参考以下文章

锁定变量与信号量

如何使用信号量锁定表?

分段错误错误(信号名称:SIGSEGV)的原因是啥,我将如何找到/修复它?

文件锁定与信号量

如何使用OR原语使用信号量锁定某些线程?

当iPhone锁定在iOS5上时,如何防止应用程序被发送终止信号?