首页 > 解决方案 > 解除阻塞等待信号量的所有进程

问题描述

我有一个程序需要多个进程访问共享资源。当它们都启动时,这个共享资源并不存在,因此需要其中一个来创建它。创建共享资源后,将安装重要的基础架构以供以后使用。但是,如果“创建者”进程在它可以在共享资源中安装基础设施之前被调度,则有可能其他进程将尝试使用未初始化的数据(导致未定义的行为)。

为了控制这一点,我创建了一个命名信号量 ( sem_t *sem_init)。任何不是创建者的进程都会“关闭”或“等待”这个零初始化的信号量。创建者进程完成设置后,它会“启动”或“发布”信号量,释放进程。然而,仍然存在一个问题。我不知道到底有多少进程在等待它


为了解决这个问题,我有以下选择:

  1. 我创建了一个计数信号量。在阻塞初始化信号量之前,每个进程在此信号量上“向上”或“发布”。这样,我就可以知道要释放多少进程。

  2. 我只是在初始化信号量上“发布”,直到它达到最大允许值。


我不喜欢这些“解决方案”。一方面,当涉及到我可以计算的进程数量时,我受到信号量的最大大小的限制。似乎“发布”这么多次会产生令人讨厌的开销。那么我的问题是,是否有任何方法可以指示信号量释放所有阻塞的进程,而无需我进行任何明确的簿记。我也不希望受到信号量最大值的限制。

像:sem_releaseAll (sem_t *sem_p);将是理想的。

注意:我非常喜欢 Linux 原生解决方案。

标签: linuxmultithreadinglockingsemaphorerace-condition

解决方案


推荐阅读