在Linux中的多个线程上阻塞read()和write()

时间:2014-05-04 01:11:48

标签: linux asynchronous blocking

我有一个Linux进程,需要从键盘和鼠标中读取。它需要异步执行此操作,同时还要执行一些主要过程。

我提出的实现是将主进程放在一个线程中,并且有两个独立的线程总是从键盘和鼠标读取()。如果Linux read()被阻塞,当主线程继续执行(我想要的)时,键盘和鼠标线程是否会被阻塞,或者整个进程是否会被阻塞?

2 个答案:

答案 0 :(得分:2)

进程中的所有线程都不会因进程中的一个或多个线程被阻塞而阻塞。如果能够在有效的调度程序规则内运行,则将调度每个线程。

所以你的设计非常有效。如果您读取的数据必须由另一个线程使用,请使用正确的同步技术。信号量和消息队列非常方便。

答案 1 :(得分:0)

您可以使用多个线程,answered by Amardeep,然后您需要同步技术(可能是Pthread condition variables和互斥)。然后阅读tutorial about pthreads

请注意,对于终端中的真实键盘输入,您可能希望使用ncursesreadline等库(它们允许比经典getline(3)fgets方法更多的编辑;阅读tty demystified页面。

您还可以在event loop之类的多路复用系统调用周围找到poll(2)。见this example。然后你可以(或不)拥有一个线程。

你可能还想要一个图形用户界面(即窗口,按钮等......),然后你想使用像QtGtklibsdl等库,提供强大的事件循环。 (不敢直接进行低级X11编程,life is too short进行that

您可能希望non-blocking IO(在事件循环中很方便),使用fcntl(2) F_SETFL O_NONBLOCK标记进行设置。

您可以执行Posix异步IO,请参阅aio(7)

您可能希望通过SIGIO signal(7)通知IO是可能的(但是请小心使用信号,通常信号处理程序只设置在其他位置测试的volatile sig_atomic_t变量!) ,将fcntlF_SETOWN一起使用(getpid(2)的结果)和O_ASYNC

您还可以使用像libonion

这样的HTTP服务器库,使您的应用程序成为专门的Web服务器

您应该阅读Advanced Linux Programming