繁体   English   中英

std :: iostream是否是非阻塞的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM