Linux,取消阻塞read()

时间:2013-05-19 16:53:41

标签: linux multithreading io java-native-interface blocking

在用于串行通信的多线程Linux程序中,是否有可能(以及最好的方法)终止来自另一个线程的阻塞read()调用?

我希望尽可能保持一切反应,并避免在重复投票时使用超时。

这个问题的背景是我正在尝试使用JNI为Linux创建Scala串行通信库。我试图保持原生方尽可能简单,除其他外,提供read()和close()函数。在Scala端,一个线程将调用read()并阻塞,直到来自串行端口的数据可用。但是,串口可以通过其他方式关闭,从而调用close()。现在,为了释放被阻塞的线程,我会以某种方式取消系统读取调用。

3 个答案:

答案 0 :(得分:10)

一个相当流行的技巧:不是在read()中阻塞,而是在串行套接字和管道上的select()中阻塞。然后当另一个线程想要唤醒你的线程时,它可以通过将一个字节写入该管道的另一端来实现。该字节将导致select()返回,您的线程现在可以清理并退出或无论需要做什么。 (注意,为了使这项工作100%可靠,您可能希望将串行套接字设置为非阻塞,以确保您的线程仅在select()中阻塞而从不在read()中阻塞

答案 1 :(得分:4)

AFAIK信号是阻止任何线程脱离阻塞系统调用的唯一方法。

使用针对该线程的pthread_kill()和USR1信号。

答案 2 :(得分:1)

你可能会做假数据输入:

tty_ioctl(fd,TIOCSTI,"please unblock!");

在调用它之前,你应该设置一些全局标志,以便能够在阅读(...)'之后进行检查。返回,如果收到的数据只是唤醒goo或更重要的东西。

来源:https://www.systutorials.com/docs/linux/man/4-tty_ioctl/