我有一个使用open() [O_RDWR | O_NONBLOCK]、write()、select()、read()和close()来处理设备文件的C++控制台应用程序。也可以调用ioctl()来取消当前操作。在任何给定时间,只有一个用户可以使用设备工作。
我需要想出一个具有libsigc++信号的C++类,当设备上的数据可用时,这些信号就会触发。
问题:当调用select()时,应用程序在等待数据时变得没有响应。如何让它响应--通过在工作线程中调用select()?如果是这样的话-工作线程如何与主线程通信?也许我应该调查一下boost::asio
发布于 2012-10-07 19:54:13
选择如何使其响应-通过在工作线程中调用
()
您可以使用dup(),这将复制您的文件描述符...因此,您可以将整个读取操作移动到另一个线程中。因此,您的写入线程和处理线程将会响应,即使读取select()线程处于休眠状态。
libsigc++的信号发送开销很小,因此我认为您可以将代码嵌入到读线程本身中。插槽可以存在于不同的线程中,这是你接收信号的地方……
尽管thrift不使用libsigc++,但我认为完全基于boost的Thrift源代码可能会引起您的兴趣。
发布于 2013-05-21 04:13:54
听起来您好像误解了select;select (或poll、epoll等)的目的不是“等待数据”,而是“等待一系列文件描述符或计时器上发生的一个或多个事件,或要引发的信号”。
在您的select调用中,缺少了什么“响应性”?您说它是一个控制台应用程序,所以您不是在谈论GUI循环,所以它可能与IO相关?如果是这样,那么您需要重构select,使等待您所讨论的数据成为一个元素;也就是说,如果您使用select,则构建您想要等待输入的所有文件/套接字描述符(以及标准输入和标准输出是文件描述符)的FD_SETs。
或者构建一个循环,对任何挂起的输入定期调用" select“,并对/test/进行短暂的超时,并且仅在select告诉您有要读取的内容时才尝试读取它。
发布于 2013-05-22 04:16:44
听起来你有一个producer-consumer风格的问题。有各种方法可以实现这个问题的解决方案,但现在大多数人倾向于使用基于condition variable的方法(请参阅此C++11 based example)。
还有许多设计模式在实现时可以帮助缓解并发问题,例如:
Half-Sync / Half-Async
Leader / Followers
here.提供了
https://stackoverflow.com/questions/12768382
复制相似问题