Linux:应用程序响应和select()

时间:2012-10-07 11:22:50

标签: c++ linux multithreading boost-asio boost-thread

我有一个C ++控制台应用,它使用open() [O_RDWR | O_NONBLOCK]write()select()read()close()来处理设备文件。也可以调用ioctl()来取消当前操作。在任何给定时间,只有一个用户可以使用设备。

我需要提出具有libsigc ++信号的C ++类,当设备提供数据时会触发这些信号。

问题:当调用select()应用程序在等待数据时变得无响应时。如何通过在工作线程中调用select()来使其响应?如果是这样 - 工作线程将如何与主线程通信?也许我应该调查boost::asio

3 个答案:

答案 0 :(得分:0)

  
    

如何使其响应 - 通过在工作线程中调用select()

  

您可以使用dup(),这将复制您的文件描述符...因此您可以将整个读取操作移动到另一个线程中。因此,即使read [select()]线程处于休眠状态,您的写线程和处理线程也会响应。

libsigc ++的信号发射开销很小,因此我认为你可以在读取线程本身内嵌入代码。插槽可以存在于不同的线程中,这是您将收到信号的地方......

我认为Thrift源代码[完全基于提升]可能是您感兴趣的,尽管thrift不使用libsigc ++。

答案 1 :(得分:0)

听起来好像你误解了选择; select(或poll,epoll等)的目的不是等待数据"但是"等待一系列文件描述符或计时器上发生一个或多个事件,或者要引发的信号"。

什么"响应能力"您在选择通话中失踪了吗?你说它是一个控制台应用程序,所以你不是在谈论GUI循环,所以可能是与IO有关?如果是这样,那么你需要重构你的选择,以便等待你所谈论的数据是一个元素;也就是说,如果您正在使用select,那么构建您想要等待输入的所有文件/套接字描述符(以及stdin和stdout是文件描述符)的FD_SET。

或构建一个定期调用"选择"对于任何待处理的输入都有一个短暂的超时/测试/,只有在选择告诉你有东西需要阅读时才尝试阅读它。

答案 2 :(得分:0)

听起来你有producer-consumer式问题。有多种方法可以实现此问题的解决方案,但如今大多数人都倾向于使用基于condition variable的方法(请参阅此C++11 based example)。

还有许多设计模式在实现时可以帮助缓解并发问题,例如:

Half-Sync / Half-Async
  • 生成者 - 消费者样式模式,它在用事件填充队列的异步层和处理这些事件的同步层之间引入队列。
Leader / Followers
  • 多个线程轮流处理事件
  • 有相关讨论here