【发布时间】:2012-09-27 21:59:16
【问题描述】:
我有一个 C++ 控制台应用程序,它使用 open() [O_RDWR | O_NONBLOCK]、write()、select()、read() 和 close() 来处理设备文件。也可以调用ioctl() 来取消当前操作。在任何给定时间,只有一个用户可以使用设备。
我需要提出具有 libsigc++ 信号的 C++ 类,当设备提供数据时会触发这些信号。
问题:当调用select() 时,应用程序在等待数据时变得无响应。如何使其响应 - 通过在工作线程中调用 select()?如果是这样 - 工作线程将如何与主线程通信?也许我应该看看boost::asio?
【问题讨论】:
-
不想等待数据为什么还要调用select呢?如果您只想检查数据是否可用,请使用超时为零的 select(请参阅
man select)。 -
@JonasWielicki 如何比等待特定时间量或无限期等待更好?如果超时为零,那么对 select() 的调用将在循环中执行,并且无论如何都会阻塞。还是我错过了什么?
-
如果你不想等待,为什么还要经常调用 select?
-
@JonasWielicki 事先不知道数据何时可用,这就是应用程序等待的原因
-
也许你必须重新考虑你的设计。要么您有工作要做,在这种情况下,您可以在
select循环内完成工作,或者您不这样做,然后您不介意select是否进入睡眠状态。将 eventfd 添加到 fd 集可能是让您的“工作”确定何时需要再次唤醒它的好方法。
标签: c++ linux multithreading boost-asio boost-thread