gpt4 book ai didi

Linux,取消阻塞read()

转载 作者:IT王子 更新时间:2023-10-29 00:40:42 26 4
gpt4 key购买 nike

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

我希望尽可能地保持 react 性,并避免在重复轮询时使用超时。

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

最佳答案

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

关于Linux,取消阻塞read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com