Порты завершения ввода / вывода потрясающие. Нет лучшего слова, чтобы описать их. Если что-то в Windows было сделано правильно, это порты завершения.
Вы можете создать некоторое количество потоков (на самом деле не имеет значения, сколько) и сделать так, чтобы все они блокировались на одном порте завершения до события (того, которое вы публикуете вручную, или события из таймера или асинхронный ввод-вывод, или что-то еще) приходит. Затем порт завершения пробудит один поток для обработки события, до указанного вами предела. Если вы ничего не указали, он будет предполагать «до количества ядер ЦП», что действительно хорошо.
Если уже существует больше активных потоков, чем максимальный предел, он будет ждать, пока один из них не будет завершен, и затем передает событие потоку, как только он перейдет в состояние ожидания. Кроме того, он всегда будет пробуждать потоки в порядке LIFO, поэтому есть вероятность, что кэши все еще горячие.
Другими словами, порты завершения - это беспроблемный "опрос на предмет событий", а также решение "заполнить ЦП как можно больше".
Вы можете генерировать чтение и запись файла в порт завершения, сокеты или что-либо еще, что можно ожидать. И вы можете публиковать свои собственные события, если хотите. Каждое пользовательское событие имеет как минимум одно целое число и один указатель данных (если вы используете структуру по умолчанию), но вы не ограничены этим, поскольку система с радостью примет любую другую структуру.
Кроме того, порты завершения быстрые, действительно очень быстрые. Давным-давно мне нужно было уведомлять одну ветку от другой. Случилось так, что у этого потока уже был порт завершения для файлового ввода-вывода, но он не перекачивал сообщения. Итак, я подумал, стоит ли мне просто прикусить пулю и использовать порт завершения для простоты, хотя публикация сообщения потока, очевидно, будет гораздо более эффективной. Я не определился, поэтому я сравнил. Сюрпризом оказалось, что завершение портов было примерно в 3 раза быстрее. Так что ... быстрее и гибче, решение было несложным.