Асинхронный файловый ввод / вывод с использованием потоков в C - PullRequest
2 голосов
/ 13 октября 2010

Я пытаюсь понять, как асинхронные файловые операции эмулируются с помощью потоков. Я нашел практически бесполезные материалы по этой теме.

Возможно ли, что:

  1. процесс использует поток, чтобы открыть обычный файл (HDD).
  2. родитель получает дескриптор файла из потока, теперь он может закрыть поток.
  3. родитель использует дескриптор файла с новым потоком, считывая из файла байты X.
  4. родитель получает дескриптор файла с позицией поиска текущего состояния файла.
  5. родитель может повторить эти операции без необходимости открывать или искать каждый раз, когда он хочет «продолжить» чтение нового фрагмента файла?

Это просто дикая догадка, я был бы признателен, если бы кто-нибудь захотел пролить больше света, чтобы прояснить, как эффективно имитируется.

UPDATE: Под эффективностью я имею в виду, что я не хочу, чтобы поток «ждал» с момента открытия файла. Подумайте о HTTP-неблокирующем демоне, который обслуживает клиента с огромным файлом, вы хотите использовать поток для чтения фрагментов файла без блокировки демона - но вы не хотите, чтобы поток был занят, ожидая фактическая передача для выполнения, вы хотите использовать поток для других операций блокировки других клиентов.

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Чтобы лучше понять асинхронный ввод / вывод, может быть полезно подумать о перекрывающейся операции. То есть количество ожидающих операций (операций, которые были запущены, но еще не завершены) может одновременно превышать единицу.

Диаграмма, поясняющая асинхронный ввод-вывод, может выглядеть следующим образом: http://msdn.microsoft.com/en-us/library/aa365683(VS.85).aspx

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

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

0 голосов
/ 13 октября 2010

При открытии / создании файла запускается поток.Теперь сохраните этот идентификатор потока / ptr как дескриптор файла.

По сути, поток ничего не будет делать, кроме как сидеть в цикле в ожидании "события".Семафор был бы хорош здесь.Когда вы хотите выполнить чтение, вы добавляете команду чтения в очередь (не забудьте добавить в стек критическую секцию), возвращаете уникальный идентификатор, а затем увеличиваете семафор.Если поток спит, он теперь проснется и заберет первое сообщение из очереди и обработает его.Когда она завершится, вы удалите команду из очереди.

Чтобы узнать, завершено ли чтение файла, вы можете просто проверить, находится ли он в очереди команд.Если его там нет, то команда завершилась.

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

...