【问题标题】:Signal/Pause Deadlock信号/暂停死锁
【发布时间】:2012-03-20 12:17:40
【问题描述】:

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

 * 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)之后的某个时间,操作系统切换到父级,而从未让子级暂停()。当它恢复孩子时(在父母调用暂停之后),孩子​​然后暂停,我有一个死锁:(。

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    为了避免这种竞争,您需要使用sigprocmask() 阻止您正在使用的信号。然后,插入pause(),使用sigsuspend() 原子地解除对信号的阻塞并暂停进程。

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

    【讨论】:

    • 谢谢!这似乎很有帮助
    【解决方案2】:

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

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

    【讨论】:

    • 或更现代的 POSIX IPC 等价物。
    • 这取决于应用程序。 IPC 并不难使用。将功能分离以分离进程和线程有很多好处,它们本身就有很多问题。考虑到调试单独的进程或线程的选择,前者几乎总是更容易。
    • 谢谢你们!不幸的是,线程不是我的选择。我正在使用一个使用许多全局变量设计得很糟糕的大型程序,并且每个实例都需要自己单独的内存段。我想管理该程序的一些实例以进行子计算,然后收集结果。我必须有效地做到这一点,因此我选择使用共享内存。您认为我应该使用哪些选项(来自 POSIX IPC)?
    • @LironCohen: sem_open() / sem_post() / sem_wait() / sem_close() 可能是您协调访问共享内存段所需要的。
    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多