根据Boost.Iostreams的加速参考(在第3.6节,最底部):
http://www.boost.org/doc/libs/1_64_0/libs/iostreams/doc/index.html
虽然Boost.Iostreams过滤器和设备概念可以 适应非阻塞i / o,C ++标准库流和 流缓冲接口不能,因为它们缺乏手段 区分临时和永久失败以满足读数 或写请求
但是,函数std::istream::readsome
似乎是非阻塞的,因为可以立即返回可用字符,而不会阻塞(RAM副本除外)等待。我的理解是:
std::istream::read
将阻止,直到eof
或读取的字符数为止。
std::istream::readsome
将立即返回从内部缓冲区复制的字符。
答案 0 :(得分:5)
我同意你的观点,readsome
不是阻止操作。但是,如规定的那样,它完全不适合作为执行通常称为"非阻塞I / O"的接口。
首先,无法保证readsome
将永远返回新数据,即使它可用。因此,为了保证您实际取得进展,您必须最终使用其中一个阻止接口。
其次,无法知道readsome
何时会返回数据。没有办法"民意调查"流,或得到一个"通知"或"事件"或者"回调"。可用的非阻塞接口至少需要其中一个。
简而言之,readsome
似乎是一种半成品且未充分指定的尝试,为I / O流提供非阻塞接口。但我从未见过它在生产代码中使用过,我不希望这样。
我认为Boost文档夸大了论证,因为正如您所观察到的,readsome
当然能够区分暂时性和永久性失败。但由于上述原因,他们的结论仍然是正确的。
答案 1 :(得分:3)
在研究非阻塞可移植性时,我没有在C ++标准库中找到任何看起来像你认为的那样的东西。
如果您的目标是可移植性,我的解释是,最重要的部分是:
例如,当与std :: ifstream一起使用时,会有一些库 实现尽快用数据填充底层filebuf 文件被打开(而且这些实现上的readsome()读取数据, 其他可能,但不一定是整个文件) 实现仅在实际输入操作时从文件读取 请求(和文件打开后发出的readsome()永远不会提取任何 字符)。
这表示使用iostream接口的不同实现允许懒惰地进行工作,并且readsome()不保证工作甚至被启动。
但是,我认为您对readome的解释保证不会阻止是真的。