我有多个工作人员从父进程分叉,需要在完全相同的时间通知他们所有人来运行/停止;
父:
while(1)
{
workers_start!
usleep(work_time);
workers_stop!
usleep(sleep_time);
}
我应该用什么快速通知他们(!)?信号量(计数N),互斥量,信号(执行分叉程序后)?我听说信号量/互斥量很慢。我不确定信号,但我不知道发送这么多信号是不是一个好主意(N工人* 1或2信号/每0.2秒,其中N是cpu核心)。
对不起,这是关于linux的。
答案 0 :(得分:2)
您可能希望将处理的所有工作人员分配到流程组。你可以通过调用
来做到这一点setpgid(pid_t pid, pid_t pgid)
其中“pid是对每个工人的”fork()“调用的返回,而pgid是所有工人的项目组ID,对于所有工人应该是相同的。手册页在这里:
http://man7.org/linux/man-pages/man2/getpgrp.2.html
然后,只需拨打一次
,即可向所有流程发送信号killpg(int pgrp, int sig)
其中pgrp是您在上述步骤中分配给所有员工的组。至于killpg调用中“sig”的值,如果你有一个POSIX平台,你可能想要用户定义的siganls,例如SIGUSR1,SIGUSR2分别用于信号的启动和停止。如果没有,您可以使用标准信号并捕获它们(覆盖它们的行为)。 killpg的手册页在这里:
http://man7.org/linux/man-pages/man2/killpg.2.html
我希望这很清楚,与您正在寻找的相似。
答案 1 :(得分:0)
这取决于您使用的操作系统。一般来说,质量“我听说信号量很慢”的信息总是带着一粒盐。一些快速测试可能会为您的案例揭示最佳解决方案:)