信号/暂停死锁

时间:2012-03-01 23:23:43

标签: c++ linux process deadlock shared-memory

我很难通过信号和共享内存管理子进程(我知道管道可能更好)。我有以下循环:

 * parent processing something, then signaling the children and going into pause,
 * children processing something, then signaling the parent and going into pause,
 * etc. etc.

问题在于,在发信号通知父节点(通过kill)后,os切换到父节点而不让子节点暂停()。当它恢复孩子时(在父母调用暂停之后),孩子​​然后暂停并且我有一个死锁:(。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您正在尝试使用信号机制自行实现原子信号量,并且您已经发现这是不可能的,因为您无法获得它所需的保证。

我建议调查pthreads系统提供的设施,而不是从多进程范例转变为多线程范例。如果做不到这一点,你可能会尝试使用(严重老化的)System V IPC机制,但我认为使用pthreads会好得多。

答案 1 :(得分:2)

为了避免这种竞争,您需要阻止使用sigprocmask()的信号。然后,在pause()的情况下,使用sigsuspend()以原子方式解锁信号并暂停该过程。

这意味着如果在流程调用sigsuspend()之前发送信号,则在sigsuspend()之前不会发送信号。