Является ли std:: iostream неблокирующим?

В соответствии с инструкцией boost для Boost.Iostreams(В разделе 3.6, в самом низу):

http://www.boost.org/doc/libs/1_64_0/libs/iostreams/doc/index.html

Хотя концепции фильтра и устройства Boost.Iostreams могут неблокирующий ввод-вывод, стандартный поток библиотек С++ и интерфейсы буфера потока не могут, поскольку им не хватает средств для различать временные и постоянные сбои для или написать запрос

Однако функция std::istream::readsome оказывается неблокирующей, так как доступные символы будут немедленно возвращены, без блокировки (за исключением копии RAM). Я понимаю, что:

std::istream::read будет блокироваться до eof или количества прочитанных символов.

std::istream::readsome немедленно вернется с символами, скопированными из внутреннего буфера.

Ответ 1

Я согласен с вами в том, что readsome не является блокировкой. Однако, как указано, он полностью неадекватен как интерфейс для выполнения так называемого "неблокирующего ввода-вывода".

Во-первых, нет гарантии, что readsome когда-либо вернет новые данные, даже если они доступны. Поэтому, чтобы гарантировать, что вы действительно достигли прогресса, вы должны в конечном итоге использовать один из интерфейсов блокировки.

Во-вторых, нет способа узнать, когда readsome вернет данные. Невозможно "опросить" поток или получить "уведомление" или "событие" или "обратный вызов". Для использования неблокирующего интерфейса требуется хотя бы один из них.

Короче говоря, readsome представляет собой попытку полупериодической и недооцененной попытки обеспечить неблокирующий интерфейс для потоков ввода-вывода. Но я никогда не видел, чтобы он использовался в производственном коде, и я не ожидал.

Я думаю, что документация Boost преувеличивает аргумент, потому что, как вы заметили, readsome, безусловно, может различать временный от постоянного отказа. Но их выводы по-прежнему верны по причинам выше.

Ответ 2

При изучении неблокирующей переносимости я не нашел ничего в стандартной библиотеке С++, которая выглядела так, как будто она сделала то, что вы думаете.

Если ваша цель - переносимость, моя интерпретация заключалась в том, что раздел, который имел значение больше всего, был следующим:

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

Например, при использовании с std:: ifstream, некоторая библиотека реализации заполняют базовый файлbuf данными, как только файл открывается (и readsome() на таких реализациях считывает данные, потенциально, но не обязательно, весь файл), тогда как другие реализация выполняется только из файла, когда фактическая операция ввода запрошенный (и readsome(), выданный после открытия файла, никогда не извлекает никаких символы).

Это говорит о том, что различные реализации, использующие интерфейс iostream, позволяют выполнять свою работу лениво, а readsome() не гарантирует, что работа даже начнется.

Однако, я думаю, ваша интерпретация, согласно которой readsome гарантированно не блокируется, верна.