C编程futex_wait_queue_me和信号量

时间:2013-08-16 16:57:43

标签: c linux signals semaphore futex

我有一个偶尔挂在futex_wait_queue_me等待频道的程序,它每2到10周发生一次,所以很难调试。它发生在一段时间之前,当它在Ubuntu 10.04 LTS下运行时,现在它仍然在Ubuntu 12.04 LTS下运行,虽然第一次发生在12.04之后是4个月后,它可能是一个幸运的情况,因为它通常发生2到10周,我的意思是它是随机的,它可以更少或更多。

程序包含许多模块和很多代码,因此我只能尝试解释程序的一般功能以及我认为可能影响的内容。如果你需要更多的细节请问,因为到目前为止我还不知道如何解决这个问题,即使我已经搜索并找到类似帖子超过一年或两年但不适用于我的情况。我怀疑我使用的信号量可能会发生一些事情。

这是一个服务器程序,而不是为每个连接的设备侦听TCP端口以分叉子节点。实际上,有6个相同的服务器程序只在TCP端口和从设备接收的数据协议上运行。因此,运行的第一个服务器程序创建/初始化共享内存和信号量集。

每个孩子向其父母发送“登录”和“注销”消息,获取信号量SEM_SVRCMDEMPTY,将小数据写入SHM区域,然后将SIGUSR1发送到其父母,以通知准备处理的CMD信息。孩子继续不再等待。父进程在SIGMR1处理程序内的SHM中处理CMD数据,之后它无条件地释放SEM_SVRCMDEMPTY,以便其他子进程可以发送命令。我有其他信号量,但我怀疑这个问题与该问题有关,因为当程序挂起时,信号量仍然被获取并阻止所有其他想要向其父母发送消息的孩子。父对象是与futex_queue_me挂起的那个。

家长也会处理SIGCHLD活动。所有信号处理程序都将其掩码设置为满,这样它们就不会被任何其他信号中断。正常服务器操作正在select()中等待新连接。一旦select返回成功,我就用sigprocmask(SIG_BLOCK,& mask,& orig_mask)阻塞所有信号,并在返回select()之前在循环结束时取消阻塞。这应该可以防止任何信号在任何时候改变正在处理的任何信号。它运行良好,没有一个问题,只有偶尔的futex,在6个服务器程序之间有几百个孩子,每1-2分钟传输一次数据,并根据网络状态频繁重新连接。 我对挂起的程序进行了操作并返回:

$ sudo strace -p 28813
Process 28813 attached - interrupt to quit
futex(0xb732bb4c, FUTEX_WAIT_PRIVATE, 2, NULL

但是由于我必须尽快恢复该程序,我没有找到任何其他内容或者不知道还有什么可以尝试。

建议&问题,以进一步了解问题或代码欢迎。

0 个答案:

没有答案