适当的多线程程序终止。 C

时间:2016-05-10 15:19:39

标签: c multithreading pthreads signals terminate

嗨,我遇到了这个问题,我无法弄清楚哪个是最佳解决方案:

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

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

现在我想在收到SIGINT(例如)时终止其他线程。我怎么能正确地做到这一点?主要问题是其他线程可能正在等待条件变量或在accept()中等待(对于套接字连接)。我认为放一个像“shouldEnd”这样的变量是好事,并在线程停止工作时将其设置为1。这是一个好主意吗 ?等待的呢?主要用于等待套接字连接的那个?

1 个答案:

答案 0 :(得分: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()可以在线程完成之前退出,只是在线程处于关闭逻辑中间时强制终止线程,这很麻烦,并且可能导致程序崩溃或者更糟。