Ответ 1
В Windows операции async выполняются с помощью операции файла, а не с помощью дескриптора. Существует несколько способов ожидания асинхронного завершения операций с файлами.
Например, если вы хотите узнать, когда данные доступны в сетевом сокете, выполните запрос на чтение асинхронного запроса в сокете, и когда он будет завершен, данные будут доступны и будут восстановлены.
В Win32 операции async используют структуру OVERLAPPED
, чтобы содержать состояние о выдающейся операции ввода-вывода.
- Свяжите файлы с порт завершения ввода-вывода и отправьте асинхронные запросы ввода-вывода. Когда операция завершается, она будет помещать сообщение о завершении в очередь, которую ваши рабочие потоки могут ждать и получать по мере их поступления. Вы также можете помещать определенные пользователем сообщения в очередь. Нет ограничений на количество файлов или сообщений в очереди с портом завершения.
- Отправка каждой операции ввода-вывода с событием. Событие, связанное с операцией, будет сигнализироваться (выполнить ожидание), когда оно будет завершено. Используйте
WaitForMultipleObjects
, чтобы ждать сразу всех событий. Недостаток заключается в том, что он может просто ждать объектовMAXIMUM_WAIT_OBJECTS
сразу (64). Одновременно можно ожидать и других типов событий (прерывание процесса/потока, мьютексы, события, семафоры). - Используйте пул потоков . Пул потоков может принимать неограниченное количество объектов и файловых операций для ожидания и выполнять пользовательскую функцию после каждого завершения.
- Используйте
ReadFileEx
иWriteFileEx
для очереди Асинхронный Процедурные вызовы (APC) для вызывающего потока иSleepEx
(илиWaitFor{Single|Multiple}ObjectsEx
) с помощьюAlertable TRUE
для получения сообщение уведомления для каждой операции, когда оно завершено. Этот метод похож на порт завершения ввода-вывода, но работает только для одного потока.
Ядро Windows NT не делает различий между файлами: файлы сокета, диска, трубы и т.д. внутренне: все эти параметры будут работать со всеми типами файлов.