pthread_sigmask与aio回调线程

时间:2015-12-14 19:13:52

标签: linux multithreading signals posix aio

我的应用程序有时会终止SIGIO或SIGUSR1信号,即使我已阻止这些信号。

我的主线程以阻塞SIGIO和SIGUSR1开始,然后进行2个AIO读操作。这些操作使用线程来获取有关操作状态的通知。 notify函数(作为分离的线程调用)启动另一个AIO操作(它们操作已读取的数据并开始将其写回文件)并通过发送信号处理通知(一个操作使用SIGIO,另一个操作使用SIGUSR1)这个流程。我通过在主线程中调用sigwait来同步接收这些信号。不幸的是,有时我的程序崩溃,被SIGUSR1或SIGIO信号(应该被sigmask阻止)停止。

一种可能的解决方案是为它们设置SIG_IGN处理程序,但这并不能解决问题。不应该调用它们的处理程序,而应该在主程序循环的下一次迭代中通过sigwait从待处理信号中检索它们。

我不知道哪个线程以这种方式处理这个信号。也许是接收这个信号的初始化?还是一些shell线程?我不知道。

1 个答案:

答案 0 :(得分:1)

我猜测一个AIO回调线程或者生成信号的线程正在接收信号。 (证明我错了,我将删除这个答案。)

不幸的是,根据标准,"[t]he signal mask of [a SIGEV_THREAD] thread is implementation-defined."例如,在Linux(glibc 2.12)上,如果我在main中阻止SIGUSR1,那么设法从aio_read调用运行SIGEV_THREAD处理程序,处理程序在SIGUSR1未阻止的情况下运行。

这使得SIGEV_THREAD处理程序不适合必须可靠且可移植地处理信号的应用程序。