gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:25 24 4
gpt4 key购买 nike

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

我有一个带有一些线程的进程。所有线程都屏蔽了信号,只有一个 (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. 简单地向其他线程正在等待的 condvars 发出信号,并设置某种互斥保护 bool 值/标志来通知线程它应该提前退出(即:mutexLock()l; bool bExitEarly = true; signal(condVar); mutexUnlock();).
  3. Assuming you spawned the threads as joinable (ie: non-detached) ,只需确保您拥有指向每个线程对象的指针的副本,并在发出停止信号后对每个线程对象调用 thread_join()。这将确保线程在 main() 退出之前完全停止。如果不这样做,main() 可能会在线程完成之前退出,并在线程处于关闭逻辑中间时强行终止线程,这是困惑的,并且可能导致您的程序崩溃或更糟。

关于c - 正确的多线程程序终止。 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37142664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com