Какова сделка с boost.asio и файлом ввода/вывода?

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

Ответ 2

boost:: asio file i/o в Linux

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

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

boost:: asio file i/o в Windows

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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