热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《std::iostream是否是非阻塞的?》经验,为你挑选了1个好方法。

根据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当然能够区分暂时性和永久性失败.但由于上述原因,他们的结论仍然是正确的.


推荐阅读
author-avatar
铭娟佑廷雅冰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有