信号/暂停死锁

Signal/Pause Deadlock

本文关键字:死锁 暂停 信号      更新时间:2023-10-16

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

 * 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)后的某个时候,操作系统会切换到父母,而从不让孩子进入pause()。当它恢复子级时(在父级调用暂停之后),子级暂停,我出现死锁:(.

有什么建议吗?

为了避免这种竞争,您需要屏蔽与sigprocmask()一起使用的信号。然后,代替pause(),使用sigsuspend()原子性地解除信号阻塞并挂起进程。

这意味着,如果在进程调用sigsuspend()之前发送信号,则直到sigsuspend()才会发送信号。

您正试图使用信号机制自行实现原子信号量,但正如您所发现的,这是不可能的,因为您没有得到使其工作所需的保证。

我建议研究pthreads系统提供的设施,从多进程范式转向多线程范式。如果做不到这一点,您可能会尝试使用(严重老化的)System V IPC机制,但我认为使用pthreads会更好。