Вопрос

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

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

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

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

Решение

Поддерживает ли boost.asio какие-либо файлы?

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

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

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

Как Boost.Сам по себе Asio в настоящее время широко используется, и реализация использует перекрывающийся ввод-вывод внутри, я бы сказал, да.

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

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

Другие советы

boost:: ввод-вывод файлов asio в 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 в Windows

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top