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

时间:2017-08-31 20:31:38

标签: c++ iostream

根据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将立即返回从内部缓冲区复制的字符。

2 个答案:

答案 0 :(得分:5)

我同意你的观点,readsome不是阻止操作。但是,如规定的那样,它完全不适合作为执行通常称为"非阻塞I / O"的接口。

首先,无法保证readsome永远返回新数据,即使它可用。因此,为了保证您实际取得进展,您必须最终使用其中一个阻止接口。

其次,无法知道readsome何时会返回数据。没有办法"民意调查"流,或得到一个"通知"或"事件"或者"回调"。可用的非阻塞接口至少需要其中一个。

简而言之,readsome似乎是一种半成品且未充分指定的尝试,为I / O流提供非阻塞接口。但我从未见过它在生产代码中使用过,我不希望这样。

我认为Boost文档夸大了论证,因为正如您所观察到的,readsome当然能够区分暂时性和永久性失败。但由于上述原因,他们的结论仍然是正确的。

答案 1 :(得分:3)

在研究非阻塞可移植性时,我没有在C ++标准库中找到任何看起来像你认为的那样的东西。

如果您的目标是可移植性,我的解释是,最重要的部分是:

first comment

  

例如,当与std :: ifstream一起使用时,会有一些库   实现尽快用数据填充底层filebuf   文件被打开(而且这些实现上的readsome()读取数据,   其他可能,但不一定是整个文件)   实现仅在实际输入操作时从文件读取   请求(和文件打开后发出的readsome()永远不会提取任何   字符)。

这表示使用iostream接口的不同实现允许懒惰地进行工作,并且readsome()不保证工作甚至被启动。

但是,我认为您对readome的解释保证不会阻止是真的。