控制器和工人 - 开始/停止的信号

时间:2015-01-15 17:12:21

标签: c synchronization

我有多个工作人员从父进程分叉,需要在完全相同的时间通知他们所有人来运行/停止;

父:

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

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

对不起,这是关于linux的。

2 个答案:

答案 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)

这取决于您使用的操作系统。一般来说,质量“我听说信号量很慢”的信息总是带着一粒盐。一些快速测试可能会为您的案例揭示最佳解决方案:)