当其中一个线程收到信号并且它们都没有阻止时,是否所有线程都停止了?

时间:2015-07-10 00:58:20

标签: c linux multithreading pthreads signals

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

是的,信号被传递到一个线程,以未指定的方式选择。但是,只考虑不阻塞信号的线程;如果所有线程都阻塞了信号,它将保持排队状态,直到一个线程解除阻塞。

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