正确的多线程程序终止。 C

Proper multi-thread program termination. C

您好,我被这个问题困住了,我不知道哪个是最好的解决方案:

我有一个带有一些线程的进程。所有线程都屏蔽了信号,只有一个 (SignalHandler) 检查是否有未决信号。

  while(!shouldEnd){
        if(!sigwait(&set, &signum)){
            if(signum == SIGINT){
                fprintf(stderr, "Ricevuto SIGINT\n");
            }
            else{
                //TODO
            }
        }
    }

现在我什至想在收到 SIGINT 时终止其他线程(例如)。我怎样才能正确地做到这一点?主要问题是其他线程可能正在等待条件变量或等待 accept() (用于套接字连接)。我认为将 "shouldEnd" 之类的变量放在线程应该停止工作时将其设置为 1 是一件好事。这是一个好主意吗 ?等待的人呢?主要用于等待套接字连接的人?

所以,首先,我们不知道您使用什么线程。您可以考虑为此使用 libBoost,因为它会让您的生活更轻松 RAII style locks and whatnot.

无论如何,只有您进程的选定线程(在大多数示例中通常为 main())才会捕获 the signal, unless you've enabled signal masking。当您希望线程干净地关闭时,您只需要:

  1. 唤醒等待 accept() by modifying your FD set to include a pipe that can also wake up the blocking call.
  2. 的线程
  3. 简单地向其他线程正在等待的condvars发出信号,并设置某种互斥保护boolean/flag来通知线程它应该提前退出(即:mutexLock()l; bool bExitEarly = true; signal(condVar); mutexUnlock();)。
  4. Assuming you spawned the threads as joinable (ie: non-detached),只需确保您拥有指向每个线程对象的指针的副本,并在发出停止信号后对每个线程对象调用 thread_join()。这将确保线程在 main() 退出之前完全停止。如果不这样做,main() 可能会在线程完成之前退出,并在线程处于关闭逻辑中间时强行终止线程,这很混乱,并可能导致程序崩溃或更糟。