是std :: iostream非阻滞

Is std::iostream non-blocking?

本文关键字:iostream std      更新时间:2023-10-16

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

我同意您的看法,readsome不是阻止操作。但是,如指定,它完全不足以作为执行通常所谓的"非块I/O"的接口。

首先,也不能保证readsome ever 返回新数据,即使可用。因此,为了确保您实际取得进步,您必须最终使用其中一个封锁界面。

第二,无法知道readsome何时返回数据。没有办法"调查"流或获得"通知"或"事件"或"回调"。可用的非阻滞接口至少需要其中之一。

简而言之,readsome似乎是半烘烤的,并且未指定的尝试向I/O流提供非阻滞接口。但是我从未见过它在生产代码中使用过,我不会期望。

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

在查看非阻滞可移植性时,我在C 标准库中没有发现任何东西,看起来像您认为它做了。

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

http://en.cppreference.com/w/cpp/io/basic_istream/readsome

例如,与std :: ifstream一起使用时,一些库 实现后,实现后立即将数据填充 在此类实现上打开文件(并读取())读取数据, 可能但不一定是整个文件),而其他 仅当实际输入操作为 请求(和文件打开后发出的readSome())切勿提取任何 字符)。

这说使用使用iostream接口的不同实现可以懒惰地进行工作,并且ReadSome()并不能保证工作甚至被启动。

但是,我认为您的解释是可以保证不封锁的读书是正确的。