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