[英]Is std::iostream non-blocking?
根据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
将阻塞,直到std::istream::read
eof
或字符数。
std::istream::readsome
将立即返回从内部缓冲区复制的字符。
我同意你的说法, readsome
不是阻塞操作。 然而,如所指定的,作为用于执行通常称为“非阻塞I / O”的接口,它完全不合适。
首先,有没有保证, readsome
会再回到新的数据,即使它是可用的。 因此,为了确保您实际取得进展,您必须最终使用其中一个阻止接口。
其次,没有办法知道readsome
什么时候会返回数据。 无法“轮询”流,或获取“通知”或“事件”或“回调”。 可用的非阻塞接口至少需要其中一个。
简而言之, readsome
似乎是一种readsome
指定的尝试,为I / O流提供非阻塞接口。 但我从未见过它在生产代码中使用过,我不希望这样。
我认为Boost文档夸大了论证,因为正如你所观察到的, readsome
肯定能够区分暂时性和永久性失败。 但由于上述原因,他们的结论仍然是正确的。
在研究非阻塞可移植性时,我没有在C ++标准库中找到任何看起来像你认为的那样的东西。
如果您的目标是可移植性,我的解释是,最重要的部分是:
http://en.cppreference.com/w/cpp/io/basic_istream/readsome
例如,当与std :: ifstream一起使用时,一旦文件被打开,一些库实现就会用数据填充底层的filebuf(并且这些实现上的readsome()读取数据,可能但不一定是整个文件),而其他实现仅在请求实际输入操作时从文件读取(并且在文件打开后发出的readsome()从不提取任何字符)。
这表示使用iostream接口的不同实现允许懒惰地执行其工作,并且readsome()不保证工作甚至被启动。
但是,我认为您对readome的解释保证不会阻止是真的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.