【发布时间】:2013-11-06 06:59:40
【问题描述】:
我正在为在AI competition 中竞争的机器人实现测试服务器,机器人通过标准输入/输出与服务器通信。机器人轮到他们的时间只有这么长。在之前的 AI 竞赛中,我在 Java 中编写了服务器,并通过使用 BlockingQueue 和线程对进程流进行阻塞读/写来处理。
本次比赛希望使用 C++。我找到了Boost.Process 和 Boost.Asio,但据我所知,Asio 库没有办法超时等待读取多长时间。它的设计是围绕使用回调函数来告诉您读取何时完成。而我想阻止但最大超时。我可以使用特定于平台的 API(如 select)来执行此操作,但要寻找更多的跨平台解决方案。有什么建议吗?
编辑:为了澄清我想要一个类 BotConnection 来处理与具有两种方法的机器人进程进行通信,例如:string readLine(long timeoutInMilliseconds) 和 void writeLine(string line, long timeoutInMilliseconds)。所以调用代码的编写就像使用阻塞调用一样,但可以超时(抛出异常或更改上面的方法签名,因此如果操作完成或超时,则返回成功标志)
【问题讨论】:
-
我的另一个想法是在 Boost.Process 的输入/输出流周围使用 C++11 线程,就像在 java 解决方案中一样。
-
‘select‘ 和 ‘poll’ 提供带有可选超时的 io 等待
-
哪些平台?如果都是 unix,
select可能是最便携的。如果你需要混合窗户,我不确定。 -
主要是我想支持的 windows 和 linux 平台。 IIRC 窗口选择仅适用于套接字。
-
刚找到这个,boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp03/…,乍一看似乎有超时阻塞读/写:)
标签: c++ boost cross-platform boost-asio