这是this question的后续行动,我查看了相关问题。
我仍在尝试在收到SIGTERM
时进行一些清理,然后达到TERM
的效果,这是进程中没有线程等待信号时的默认行为,和并且没有定义信号处理程序。
在之前的问题中,我假设信号在多线程应用程序中具有确定性行为,但在一些非确定性结果和一些研究之后,我意识到这不是一个安全的假设。
我的应用程序是多线程的,通过sigaction
或signal
使用正常的信号处理程序具有非确定性结果,因为任意选择哪个线程实际上被中断以运行信号处理程序对信号处理程序很重要操作(它正在清理一些线程,如果错误的线程被中断,它们可能会死锁)。
因此,我转而做synchronous signal handling。特别是,我在起始线程中使用SIGTERM
阻止pthread_sigmask
,然后在将实际执行清理的线程中调用sigwait()
。但是,在sigwait()
在线程中返回后,我完成了清理,然后尝试以下操作:
kill(getpid(), SIGTERM);
但是,此信号显然被忽略,因为所有其他活动线程都阻塞SIGTERM
。因此,在从我的清理线程运行的函数返回之前,我需要在所有其他线程中解除阻塞信号。是否有可用于在其他线程上设置pthread_sigmask
的函数调用?
答案 0 :(得分:0)
无调用可用于在其他线程上设置信号掩码。接收信号是一个触发器,没有意义为自己重新发送该信号。尝试使用pthreads 条件变量。