是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
将阻塞直到 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()并不能保证工作甚至被启动。
但是,我认为您的解释是可以保证不封锁的读书是正确的。
- 使用std::multimap迭代器创建std::list
- std::带有自定义缓冲区的 iostream 不允许我写入
- 为什么我必须在包含后写 std::cin <iostream>?
- 如何将带有空字符的字节数组馈送到 std::iostream 中?
- C++:为什么 std::greater<T>() 包含在 iostream 中?
- Printing CComBSTR with iostream (std::wcout)
- 为什么我们应该在使用"using namespace std"时使用"#include<iostream>"?
- 将 boost::iostream::stream<boost::iostreams::source> 转换为 std::istream
- 是std :: iostream非阻滞
- 调整 C++ std/boost iostream 以提供对内存块的循环写入
- 如何将上下文信息传递给自定义运算符<<适用于 std::iostream
- 错误:标识符"cout"未定义。<iostream> 包含并使用命名空间 std;
- 创建一个 std::iostream 适配器
- G++ 找不到 std 标头(iostream、string 等)
- 我应该避免从std::iostream继承吗
- 如何在读写时禁用std::iostream try catch
- iostream和命名空间std之间的关系是什么?
- #include <iostream> 使用 -std=c++11 给出错误
- std::iostream读取或写入计数为零且缓冲区无效
- C++ iostream 的包装类,请使用带有运算符的 std::endl 等流修饰符<<