Является ли 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 гарантированно не блокируется, верна.