我有一个C ++控制台应用,它使用open() [O_RDWR | O_NONBLOCK]
,write()
,select()
,read()
和close()
来处理设备文件。也可以调用ioctl()
来取消当前操作。在任何给定时间,只有一个用户可以使用设备。
我需要提出具有libsigc ++信号的C ++类,当设备提供数据时会触发这些信号。
问题:当调用select()
应用程序在等待数据时变得无响应时。如何通过在工作线程中调用select()
来使其响应?如果是这样 - 工作线程将如何与主线程通信?也许我应该调查boost::asio
?
答案 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