Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确的多线程程序终止。C_C_Multithreading_Pthreads_Signals_Terminate - Fatal编程技术网

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

正确的多线程程序终止。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");

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

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

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

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

因此,首先,我们不知道线程使用的是什么。你可以考虑使用LBBooBooto,因为它会让你的生活变得更容易。 无论如何,只有进程中选定的线程(在大多数示例中,通常是
main()
)会被捕获。如果希望线程完全关闭,只需:

  • 唤醒等待的线程
    accept()
  • 只需向其他线程等待的condVar发送信号,并设置某种受互斥体保护的布尔/标志来通知线程它应该提前退出(即:
    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。