C 当其中一个线程接收到信号而没有一个线程阻止该信号时,是否所有线程都已停止?

C 当其中一个线程接收到信号而没有一个线程阻止该信号时,是否所有线程都已停止?,c,linux,multithreading,pthreads,signals,C,Linux,Multithreading,Pthreads,Signals,我正在Linux上运行一个用C编写的多线程应用程序。 要停止执行,我发送SIGINT,并从信号处理程序调用许多清理例程,最后调用exit(0) 处理程序执行清理例程时,其他线程是否仍在运行或可能会运行(上下文切换)?是的,将向一个线程发送一个信号,以未指定的方式选择。不过,只考虑不阻塞信号的线程;如果所有线程都阻止该信号,它将保持排队状态,直到有一个线程取消阻止它 (因此,如果使所有线程都阻止该信号,则可以将该信号用作确定性进程间同步机制,例如使用sigwait)在执行信号处理程序期间,处理信号

我正在Linux上运行一个用C编写的多线程应用程序。

要停止执行,我发送
SIGINT
,并从信号处理程序调用许多清理例程,最后调用
exit(0)


处理程序执行清理例程时,其他线程是否仍在运行或可能会运行(上下文切换)?

是的,将向一个线程发送一个信号,以未指定的方式选择。不过,只考虑不阻塞信号的线程;如果所有线程都阻止该信号,它将保持排队状态,直到有一个线程取消阻止它


(因此,如果使所有线程都阻止该信号,则可以将该信号用作确定性进程间同步机制,例如使用
sigwait

在执行信号处理程序期间,处理信号不会导致其他线程暂停。此外,从信号处理程序中调用清除所需的大多数函数(甚至包括
退出
!)通常是不安全的,除非您可以确保它不会中断异步信号函数


您应该做的只是将
SIGINT
以某种异步信号安全的方式接收的事实存储起来,并让程序在信号处理程序之外,作为其正常执行流的一部分在该条件下运行。然后,您可以正确地与其他线程同步(使用互斥体、条件变量等),以实现正确、安全的关闭。理想的方法甚至不是安装信号处理程序,而是阻塞所有信号,并在一个循环中有一个调用
sigwaitinfo
的专用信号处理线程来接受信号。

但是如果其他线程不阻塞信号,而接收信号的线程正在处理信号,那么其他线程是否可以运行?因为我有一个日志,在信号处理程序打印“Exit”之后,我有由不同线程引起的打印。是的,没有接收信号的线程不会做任何特殊的事情。他们不知道另一个线程收到了信号。@R。。发布另一个答案:-)您不想在信号处理程序中调用
exit()
fro,因为异步信号安全不能保证它。调用
\u exit()
。或者更好的做法是,不要从信号处理程序结束程序,而是通过让所有线程正常结束来执行正常关闭。供参考: