我很难通过信号和共享内存管理子进程(我知道管道可能更好)。我有以下循环:
* 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切换到父节点而不让子节点暂停()。当它恢复孩子时(在父母调用暂停之后),孩子然后暂停并且我有一个死锁:(。
有什么建议吗?
答案 0 :(得分:2)
您正在尝试使用信号机制自行实现原子信号量,并且您已经发现这是不可能的,因为您无法获得它所需的保证。
我建议调查pthreads系统提供的设施,而不是从多进程范例转变为多线程范例。如果做不到这一点,你可能会尝试使用(严重老化的)System V IPC机制,但我认为使用pthreads会好得多。
答案 1 :(得分:2)
为了避免这种竞争,您需要阻止使用sigprocmask()
的信号。然后,在pause()
的情况下,使用sigsuspend()
以原子方式解锁信号并暂停该过程。
这意味着如果在流程调用sigsuspend()
之前发送信号,则在sigsuspend()
之前不会发送信号。