在Linux中阻止多线程上的读()和写()

在Linux中阻止多线程上的读()和写(),linux,asynchronous,blocking,Linux,Asynchronous,Blocking,我有一个Linux进程,需要读取键盘和鼠标。它需要异步执行此操作,同时还要执行一些主进程 我提出的实现是将主进程放在一个线程中,并且有两个单独的线程总是从键盘和鼠标读取()。如果Linux read()被阻塞,那么当主线程继续执行时,键盘和鼠标线程会被阻塞(我想要的),还是整个进程会被阻塞 进程中的所有线程不会因为进程中的一个或多个线程被阻塞而阻塞。如果每个线程能够运行,将在有效调度程序的规则范围内对其进行调度 所以你的设计很有效。如果您读取的数据必须被另一个线程使用,请使用适当的同步技术。信号

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


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

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


所以你的设计很有效。如果您读取的数据必须被另一个线程使用,请使用适当的同步技术。信号量和消息队列在这方面很方便。

您可以使用多个线程,然后需要同步技术(可能是Pthread和mutex)。然后读一篇文章

请注意,对于终端中的实际键盘输入,您可能希望使用类似或的库(它们允许比经典或
fgets
方法进行更多编辑;请阅读本页)

您还可以有一个关于多路复用系统调用的示例。看见那么你可以(或者不)有一个线程

您还可能需要一个图形用户界面(即窗口、按钮等),然后您需要使用像or或etc这样的库,它提供了一个强大的事件循环。(例如,不敢直接做低级编程)

您可能希望使用
F_SETFL
设置
O_NONBLOCK
标志进行设置(这在事件循环中很方便)

您可以执行Posix异步IO,请参阅

您可能希望通过
SIGIO
通知IO是可能的(但是小心使用信号,信号处理程序通常只是设置一个
volatile sig\u atomic\u t
变量,在别处测试!),使用
fcntl
F\u SETOWN
(基于的结果)和
O\u ASYNC

您还可以使用HTTP服务器库,如


您应该阅读

没有理由阻止其他线程。或者,您也可以只使用带超时的
select
,偶尔轮询您的输入,否则处理main所做的任何事情;是另一个。您应该更喜欢
选择
(谷歌搜索
C10K问题
),并且您希望实现一个奇怪的功能,即您正在
阅读(2)
-使用鼠标和键盘。。。。通常,X11服务器正在读取它们。首选epoll(),因为它用于替换选择和轮询系统调用。关于阻塞的另一部分,一个线程上的阻塞不会阻塞同一进程的其他线程。