正确的多线程程序终止。C
嗨,我被这个问题困住了,我不知道哪一个是最好的解决方案: 我有一个进程和一些线程。所有线程都有信号屏蔽,只有一个线程(SignalHandler)检查是否有挂起的信号正确的多线程程序终止。C,c,multithreading,pthreads,signals,terminate,C,Multithreading,Pthreads,Signals,Terminate,嗨,我被这个问题困住了,我不知道哪一个是最好的解决方案: 我有一个进程和一些线程。所有线程都有信号屏蔽,只有一个线程(SignalHandler)检查是否有挂起的信号 while(!shouldEnd){ if(!sigwait(&set, &signum)){ if(signum == SIGINT){ fprintf(stderr, "Ricevuto SIGINT\n");
while(!shouldEnd){
if(!sigwait(&set, &signum)){
if(signum == SIGINT){
fprintf(stderr, "Ricevuto SIGINT\n");
}
else{
//TODO
}
}
}
现在我想在接收到SIGINT时终止其他线程(例如)。我怎样才能做好呢?主要问题是其他线程可能正在等待条件变量或在accept()中等待(对于套接字连接)。我认为在线程应该停止工作时,放置一个像“shouldEnd”这样的变量并将其设置为1是一件好事。这是个好主意吗?等待的那个呢?主要针对等待套接字连接的用户?因此,首先,我们不知道线程使用的是什么。你可以考虑使用LBBooBooto,因为它会让你的生活变得更容易。 无论如何,只有进程中选定的线程(在大多数示例中,通常是
main()
)会被捕获。如果希望线程完全关闭,只需:
accept()
mutexLock()l;bool bExitEarly=true;signal(condVar);mutexUnlock();
)thread\u join()
。这将确保线程在退出main()
之前完全停止。如果你不这样做,我正在使用pthreads。1) 感谢您检查2)那么我应该向当前等待条件变量的所有线程广播()吗?3) 已经做了。谢谢你指出。@Levenlo(1)很好。如果在几个线程中使用它,您应该考虑为它编写某种包装器。这将为你省去很多后顾之忧。(2) 对。信号也应该很好,除非有多个线程在同一个condvar上等待。是这样吗?如果是这样,您需要为每个线程设置某种类型的
bistreadAwake
标志,以跟踪哪些线程接收了广播,以防广播发生时没有等待(潜在死锁)。(3) 干得好。看来你做作业了。如果这有帮助,请考虑将其标记为“接受”。TY.2)如果线程处于唤醒状态,并且没有收到广播?我准备:在挂起(wait(cvar,mtx))之前,检查线程是否应该在pthread_退出时退出。这是一个很好的解决方案吗?@levenol是的,这可能会起作用(即:锁定互斥、检查标志、解锁互斥等)。您可以在代码中的多个位置进行该检查。与其让pthread\u exit()
调用散落在整个线程函数代码中,不如在函数末尾有一个这样的实例,然后编写整洁的代码来达到这一点。同样的原因是,除非您有非常具体的要求,否则您不希望函数中到处都有大量的return
调用。无论如何,只有进程的根线程(即:以main()开头的根线程)才会收到信号。完全错了<代码>手动线程_sigmask。