嗨,我遇到了这个问题,我无法弄清楚哪个是最佳解决方案:
我有一些线程的进程。所有线程都有信号屏蔽,只有一个(SignalHandler)检查是否有未决信号。
while(!shouldEnd){
if(!sigwait(&set, &signum)){
if(signum == SIGINT){
fprintf(stderr, "Ricevuto SIGINT\n");
}
else{
//TODO
}
}
}
现在我想在收到SIGINT(例如)时终止其他线程。我怎么能正确地做到这一点?主要问题是其他线程可能正在等待条件变量或在accept()中等待(对于套接字连接)。我认为放一个像“shouldEnd”这样的变量是好事,并在线程停止工作时将其设置为1。这是一个好主意吗 ?等待的呢?主要用于等待套接字连接的那个?
答案 0 :(得分:1)
所以,首先,我们不知道你在使用什么线程。您可以考虑使用libBoost,因为它会使RAII style locks and whatnot.
让您的生活更轻松无论如何,只有你的流程的选定线程(在大多数示例中通常为main()
)才能捕获the signal, unless you've enabled signal masking。当您希望线程干净地关闭时,您只需要:
accept()
by modifying your FD set to include a pipe
that can also wake up the blocking call。mutexLock()l; bool bExitEarly = true; signal(condVar); mutexUnlock();
)。thread_join()
。这将确保线程在main()
退出之前完全停止。如果你不这样做,main()
可以在线程完成之前退出,只是在线程处于关闭逻辑中间时强制终止线程,这很麻烦,并且可能导致程序崩溃或者更糟。