【发布时间】:2011-03-06 16:43:32
【问题描述】:
我在一个线程中运行的 linux 中有一个阻塞读取。
在程序关闭期间,我想从这个读取中中断线程。不幸的是,我无法使用 poll 或 select 并编写正确的代码,因为从中读取的文件是不实现 poll/select 功能的设备驱动程序。
作为临时解决方案,我目前通过 pthread_kill 向线程发送 SIGUSR1 信号,并从处理程序调用 pthread_exit。到目前为止,这会杀死线程并工作,但我对解决方案不满意,因为信号可能发生在任何地方,而不仅仅是在读取中。
是否有任何机制可以中断 linux 上的阻塞读取?
顺便说一句 - 我尝试从不同的线程关闭文件句柄,希望这会产生某种 IO 错误。不幸的是,这个简单的解决方案根本不起作用。
【问题讨论】:
-
信号是中断阻塞读取的唯一方法。
-
调用 pthread_exit 的信号在道德上等同于 pthread_cancel'ing 线程 fwiw(假设线程是可取消的)。 read 是一个取消点。这并不比您当前的解决方案更好,但它可能会简化一些代码。