В Windows асинхронные операции выполняются с помощью файловой операции, а не с помощью дескриптора. Существует несколько способов ожидания асинхронного завершения файловых операций.
Например, если вы хотите узнать, когда данные доступны в сетевом сокете, выполните запрос асинхронного чтения для сокета, и после его завершения данные были доступны и были получены.
В Win32 асинхронные операции используют структуру OVERLAPPED
для хранения состояния о невыполненной операции ввода-вывода.
- Свяжите файлы с Портом завершения ввода-вывода и отправьте асинхронные запросы ввода-вывода. Когда операция завершается, она помещает сообщение о завершении в очередь, которую ваши рабочие потоки могут ожидать и получать по мере их поступления. Вы также можете поместить определенные пользователем сообщения в очередь. Нет ограничений на количество файлов или сообщений в очереди, которые можно использовать с портом завершения
- Отправка каждой операции ввода-вывода с событием. Событие, связанное с операцией, станет сигнальным (удовлетворяющим ожидание) после его завершения. Используйте
WaitForMultipleObjects
, чтобы дождаться всех событий одновременно. Это имеет тот недостаток, что можно ожидать только MAXIMUM_WAIT_OBJECTS
объектов одновременно (64). Вы также можете одновременно ожидать другие типы событий (завершение процесса / потока, мьютексы, события, семафоры)
- Использовать пул потоков . Пул потоков может принимать неограниченное количество объектов и файловых операций для ожидания и выполнения определяемой пользователем функции по завершении каждого.
- Используйте
<a href="http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx" rel="nofollow noreferrer">ReadFileEx</a>
и WriteFileEx
для постановки в очередь Асинхронные вызовы процедур (APC) для вызывающего потока и SleepEx
(или WaitFor{Single|Multiple}ObjectsEx
) с помощью Alertable TRUE
для получения уведомления о каждой операции после ее завершения. Этот метод похож на порт завершения ввода-вывода, но работает только для одного потока.
Ядро Windows NT не делает различий между внутренними операциями с сокетом, дисковым файлом, каналом и т. Д.: Все эти параметры будут работать со всеми типами файлов.