作者:铭娟佑廷雅冰 | 来源:互联网 | 2023-01-20 14:57
根据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
将立即返回从内部缓冲区复制的字符.
1> Nemo..:
我同意你的意见,这readsome
不是阻止操作.然而,如所指定的,作为用于执行通常称为"非阻塞I/O"的接口,它完全不合适.
首先,有没有保证,readsome
将以往任何时候都返回新的数据,即使它是可用的.因此,为了确保您实际取得进展,您必须最终使用其中一个阻止接口.
其次,没有办法知道什么时候readsome
会返回数据.无法"轮询"流,或获取"通知"或"事件"或"回调".可用的非阻塞接口至少需要其中一个.
简而言之,readsome
似乎是一种半成品且未充分指定的尝试,为I/O流提供非阻塞接口.但我从未见过它在生产代码中使用过,我不希望这样.
我认为Boost文档夸大了论证,因为正如您所观察到的那样,readsome
当然能够区分暂时性和永久性失败.但由于上述原因,他们的结论仍然是正确的.