我在Linux上运行用C编写的多线程应用程序。
要停止执行,我发送SIGINT
并从信号处理程序调用一些清理例程,最后调用exit(0)
。
当处理程序执行清理例程时,其他线程是否仍在运行或可能正在运行(上下文切换)?
答案 0 :(得分:6)
在执行信号处理程序期间处理信号不会导致其他线程暂停。此外,从信号处理程序调用清理所需的大多数函数(包括偶数exit
!)通常是不安全的,除非您可以确保它不会中断异步信号不安全函数。
你应该做的只是存储以某种异步信号安全的方式接收到SIGINT
的事实,并让程序在信号处理程序之外作为其正常执行流程的一部分执行。然后,您可以正确地与其他线程同步(使用互斥锁,条件变量等),以实现正确,安全的关闭。理想的方法是不安装信号处理程序,而是阻塞所有信号,并在循环中调用sigwaitinfo
专用信号处理线程来接受信号。
答案 1 :(得分:3)
是的,信号被传递到一个线程,以未指定的方式选择。但是,只考虑不阻塞信号的线程;如果所有线程都阻塞了信号,它将保持排队状态,直到一个线程解除阻塞。
(因此,如果您使所有线程阻止信号,您可以将信号用作确定性的进程间同步机制,例如使用sigwait
。)