10

我正在尝试通过具有以下特征的标准输入/标准输出找到非阻塞 IO 的最佳解决方案:

  • 只要有足够的数据,就读入n 个大小的块。
  • 如果没有足够的数据,则读入部分块。
  • 如果没有可用数据,则阻塞直到有一些数据(即使它可能小于n)。

目标是在立即处理“控制”代码的同时允许有效传输大型数据集(而不是让它们停留在某个部分填充的缓冲区中)。

我知道我可以通过使用线程和 istream::get() 循环来实现这一点,或者通过编写一堆特定于平台的代码(因为你不能 select() 在 Windows 中的文件句柄上)......((那里也是 istream::readsome() ,这似乎很有希望,但我在谷歌上能找到的唯一结果是人们说它实际上效果不佳。))

由于我没有对这些 API 进行太多编码,也许有更好的方法。

4

3 回答 3

7

也许boost::asio对你有用?

于 2008-11-24T19:14:08.837 回答
2

我使用了线程和平台特定的代码。请参阅我对另一个问题的回答。我能够将特定于操作系统的东西放在 inputAvailable() 中(Linux 使用 select,Windows 只返回 true)。然后我可以在 Windows 上使用带有超时的 WaitForSingleObject() 来尝试让线程完成,然后使用 TerminateThread() 来杀死它。非常难看,但团队不想使用这种提升。

于 2009-08-14T23:37:45.373 回答
0

我做了一些类似于 jwhitlock 的事情......我最终得到了一个 StdinDataIO 类,它包含了适当的特定于操作系统的实现(*),这样我的程序的其余部分就可以在 StdinDataIO 提供的文件描述符上选择(),保持幸福地无知Windows 对标准输入的限制。如果您愿意,可以在这里这里看看,代码都是开源/BSD 许可的。

(*) 该实现是 Linux/MacOSX 的简单传递,而在 Windows 中,这是一个相当复杂的过程,即设置子线程以从标准输入读取数据并将其通过套接字接收的数据发送回主线程。 . 不是很优雅,但它有效。

于 2009-08-14T23:46:39.007 回答