【问题标题】:Blocking read() and write() on multiple threads in Linux在 Linux 中的多个线程上阻塞 read() 和 write()
【发布时间】:2014-06-20 12:25:55
【问题描述】:

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

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

【问题讨论】:

  • 其他线程没有理由阻塞。或者,您可以只使用带有超时的select,偶尔轮询您的输入,否则处理 main 所做的任何事情。
  • 线程是一种方式; select() 是另一个。
  • 您应该更喜欢 poll(2) 而不是 select(google for C10K problem),并且您想要实现 event loop
  • 好奇你read(2)-ing鼠标和键盘....一般X11服务器在读取它们。
  • 首选 epoll(),因为它旨在替换 select 和 poll 系统调用。关于阻塞的另一部分,一个线程上的阻塞不会阻塞同一进程的其他线程。

标签: linux asynchronous blocking


【解决方案1】:

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

所以你的设计是相当有效的。如果您读取的数据必须由另一个线程使用,则只需使用适当的同步技术。信号量和消息队列可用于此目的。

【讨论】:

    【解决方案2】:

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

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

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

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

    你可能想做non-blocking IO(这在事件循环中很方便),设置fcntl(2)F_SETFLO_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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多