正确的多线程程序终止。 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。当您希望线程干净地关闭时,您只需要:
- 唤醒等待
accept()
by modifying your FD set to include a pipe
that can also wake up the blocking call. 的线程
- 简单地向其他线程正在等待的condvars发出信号,并设置某种互斥保护boolean/flag来通知线程它应该提前退出(即:
mutexLock()l; bool bExitEarly = true; signal(condVar); mutexUnlock();
)。
- Assuming you spawned the threads as joinable (ie: non-detached),只需确保您拥有指向每个线程对象的指针的副本,并在发出停止信号后对每个线程对象调用
thread_join()
。这将确保线程在 main()
退出之前完全停止。如果不这样做,main()
可能会在线程完成之前退出,并在线程处于关闭逻辑中间时强行终止线程,这很混乱,并可能导致程序崩溃或更糟。
您好,我被这个问题困住了,我不知道哪个是最好的解决方案:
我有一个带有一些线程的进程。所有线程都屏蔽了信号,只有一个 (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。当您希望线程干净地关闭时,您只需要:
- 唤醒等待
accept()
by modifying your FD set to include apipe
that can also wake up the blocking call. 的线程
- 简单地向其他线程正在等待的condvars发出信号,并设置某种互斥保护boolean/flag来通知线程它应该提前退出(即:
mutexLock()l; bool bExitEarly = true; signal(condVar); mutexUnlock();
)。 - Assuming you spawned the threads as joinable (ie: non-detached),只需确保您拥有指向每个线程对象的指针的副本,并在发出停止信号后对每个线程对象调用
thread_join()
。这将确保线程在main()
退出之前完全停止。如果不这样做,main()
可能会在线程完成之前退出,并在线程处于关闭逻辑中间时强行终止线程,这很混乱,并可能导致程序崩溃或更糟。