我在C中遇到了多个线程和信号处理程序的问题:
主程序调用多个负载。每个负载都有自己的控制器。然后控制器发送信号暂停并在不同时间恢复到各自的负载。
负载的代码如下所示:
static void signal_handler(int signo) {
/* When signal PAUSE received, get into loop until RESUME arrives */
while (signo != SIGNAL_RESUME) {
/* While in the loop, the main routine gets paused */
sigwait(signalsBetweenControllerandLoad, &signo);
}
}
int load_main() {
signal(SIGNAL_PAUSE, signal_handler);
signal(SIGNAL_RESUME, signal_handler);
while(1) {
/*calculating something */
}
}
只使用一个加载时代码有效。但是当多个负载运行时,它们有时会开始干扰。如果他们这样做,程序就会在执行时冻结。但有时代码会按预期完成。负载越少,程序按预期工作的可能性就越大。
有人可以告诉我为什么它不起作用?在研究中,我发现一个进程(以及它的所有子进程)一次只能激活一个信号处理程序。这是真的吗?
编辑:我尝试重新制定我的主要问题:当我无法修改此部分时,我如何在任意时间暂停/恢复/*calculating something */
中的load_main()
部分("黑匣子&# 34;,外部给定功能)?
非常非常感谢你!
答案 0 :(得分:1)
从signal's man page开始,它提到信号是按进程属性。因此在多线程程序中,所有线程的信号处理程序都是相同的。
您可以尝试使用信号量来替换您尝试使用的信号方法。有关更多详细信息,请阅读POSIX semaphore man page。它还有示例代码供您参考。