控制器和工作人员 - 向 start/stop 发送信号

Controller and workers - signal to start/stop

我有多个从父进程派生出来的工人,需要同时通知他们 运行 / 停止;

家长:

while(1)
{    
    workers_start!
    usleep(work_time);
    workers_stop!
    usleep(sleep_time);
}

我应该用什么来快速 (!) 通知他们?信号量(计数 N)、互斥锁、信号(在 execve 分叉程序之后)?我听说 semaphores/mutexes 很慢。我不确定信号,但我不知道发送这么多信号是否是个好主意(N 个工作人员 * 1 或 2 个信号/每 0.2 秒,其中 N 是 cpu 个核心)。

抱歉,大约是 linux。

这取决于您使用的操作系统。一般来说,关于质量 "I heard semaphores are slow" 的信息总是持保留态度。一些快速测试可能会揭示适合您的情况的最佳解决方案:)

您可能希望将所有已处理的工作人员分配给一个进程组。您可以通过调用

setpgid(pid_t pid, pid_t pgid)

其中 "pid is the the return of the "fork()" 调用您的每个工人,pgid 是您所有工人的项目组 ID,所有工人应该相同。手册页在这里:

http://man7.org/linux/man-pages/man2/getpgrp.2.html

然后您可以通过一次调用向所有进程发送信号

killpg(int pgrp, int sig)

其中 pgrp 是您在上述步骤中分配给所有工作人员的组。至于 killpg 调用中 "sig" 的值,如果你有一个 POSIX 平台,你可能想要使用用户定义的信号,例如 SIGUSR1,SIGUSR2 分别用于发出开始和停止信号。如果没有,您可以使用标准信号并捕获它们(覆盖它们的行为)。 killpg 的手册页在这里:

http://man7.org/linux/man-pages/man2/killpg.2.html

我希望这足够清楚并且与您正在寻找的相似。