Как обстоят дела с boost.asio и файловым вводом-выводом? - PullRequest
42 голосов
/ 18 декабря 2008

Я заметил, что в boost.asio есть много примеров, включающих сокеты, последовательные порты и всевозможные не файловые примеры. Google на самом деле не особо заинтересовал меня, который упоминает, является ли asio хорошим или правильным подходом для выполнения асинхронного ввода / вывода файлов.

У меня есть куча данных, которые я хотел бы записать на диск асинхронно. Это можно сделать с помощью встроенного перекрытия ввода / вывода в Windows (моя платформа), но я бы предпочел иметь независимое от платформы решение.

Мне любопытно, если

  1. boost.asio поддерживает файлы любого типа
  2. Поддержка файла boost.asio достаточно развита для ежедневного ввода / вывода файлов
  3. Будет ли когда-нибудь добавлена ​​поддержка файлов? Каковы перспективы для этого?

Ответы [ 5 ]

18 голосов
/ 18 декабря 2008

Имеет ли boost.asio какую-либо поддержку файлов?

Начиная с (я думаю) Boost 1.36 (который содержит Asio 1.2.0), вы можете использовать [boost :: asio ::] windows :: stream_handle или windows :: random_access_handle, чтобы обернуть HANDLE и выполнить асинхронные методы чтения и записи. на нем, которые используют структуру OVERLAPPED для внутреннего использования.

Пользователь Lazin также упоминает boost :: asio :: windows :: random_access_handle, который можно использовать для асинхронных операций (например, именованные каналы, но также и файлы).

Достаточно ли развита поддержка файла boost.asio для повседневного файлового ввода-вывода?

Поскольку Boost.Asio сам по себе уже широко используется, и реализация использует внутреннее перекрытие ввода-вывода, я бы сказал, да.

Будет ли когда-нибудь добавлена ​​поддержка файлов? Каковы перспективы для этого?

Поскольку на веб-сайте Asio дорожной карты не найдено, я бы сказал, что в Boost.Asio не будет добавлено никаких новых дополнений для этой функции. Хотя всегда есть шанс, что авторы добавят код и классы в Boost.Asio. Может быть, вы даже можете внести недостающие части самостоятельно! : -)

6 голосов
/ 09 февраля 2016

boost :: asio file I / O в Linux

В Linux asio использует механизм epoll, чтобы определить, готов ли дескриптор сокета / файла для чтения / записи. Если вы попытаетесь использовать vanilla asio для обычного файла в Linux, вы получите исключение «операция не разрешена», поскольку epoll не поддерживает обычные файлы в Linux .

Обходной путь - настроить asio для использования механизма select в Linux. Вы можете сделать это, определив BOOST_ASIO_DISABLE_EPOLL. Здесь компромисс между select обычно медленнее, чем epoll , если вы работаете с большим количеством открытых сокетов. Регулярно открывайте файл, используя open(), а затем передайте дескриптор файла в boost::asio::posix::stream_descriptor.

boost :: asio file I / O в Windows

В Windows вы можете использовать boost::asio::windows::object_handle, чтобы обернуть Handle, который был создан из файловой операции. См. пример .

5 голосов
/ 20 февраля 2012

ASIO поддерживает перекрывающиеся операции ввода-вывода в Windows, где поддержка хорошая. В Unixes эта идея застоялась из-за:

  • Файлы часто находятся на одном физическом устройстве, поэтому последовательный доступ к ним предпочтителен.
  • Запросы файлов часто выполняются очень быстро, потому что они физически находятся рядом.
  • Файлы часто имеют решающее значение для завершения основных операций программы (например, чтение в ее файле конфигурации должно быть выполнено до дальнейшей инициализации)

Единственным распространенным исключением является передача файлов непосредственно в сокеты. Это настолько частый случай, когда в Linux есть функция ядра , которая обрабатывает это для вас. Опять же, отрицание причины использования асинхронного файлового ввода-вывода.

Вкратце: ASIO, по-видимому, отражает основную философию проектирования ОС, перекрывающийся ввод-вывод игнорируется большинством разработчиков Unix, поэтому он не поддерживается на этой платформе.

4 голосов
/ 18 декабря 2008

boost :: asio :: windows :: random_access_handle - это самый простой способ сделать это, если вам нужно что-то более сложное, например, асинхронный LockFileEx или что-то еще, вы можете расширить asio, добавить свои собственные асинхронные события. пример

1 голос
/ 04 октября 2013

В Linux есть библиотека asio, которую не сложнее использовать, чем Windows API для этой работы (я ее использовал). Оба набора операционных систем реализуют одну концептуальную архитектуру. Они отличаются в деталях, которые имеют отношение к написанию хорошей библиотеки, но не настолько, что у вас не может быть общего интерфейса для обеих платформ ОС (я использовал один).

По сути, все варианты ввода-вывода Async File соответствуют архитектуре Fry Cook. Вот что я имею в виду в контексте операции чтения: я (поток обработки) подхожу к прилавку быстрого питания (ОС) и спрашиваю чизбургер (некоторые данные). Он дает мне копию моего заказа (некоторую структуру данных) и выдает билет сзади на повара (ядро и файловая система), чтобы приготовить мой гамбургер. Затем я сижу или читаю телефон (делаю другую работу). Позже кто-то объявляет, что мой бургер готов (сигнал для потока обработки), и я собираю свою еду (буфер чтения).

...