Используйте порт завершения ввода-вывода (см. здесь ) в качестве своей очереди; они не обязательно должны быть просто связаны с операциями ввода-вывода и очень просты в использовании и работают очень хорошо благодаря тому, как ядро может быть настроено на ограничение числа потоков, которые запускаются в вашем пуле потоков.
Обычно вы звоните PostQueuedCompletionStatus()
, чтобы поместить элементы в очередь, и GetQueuedCompletionStatus()
, чтобы снять их. Вам не нужно беспокоиться о синхронизации и т. Д.
Если вам нужна дополнительная помощь для того, чтобы заставить его работать, вы можете взглянуть на мою бесплатную высокопроизводительную серверную платформу , которая включает в себя довольно много кода IOCP, включая отдельный пул потоков, который никак не связан с вводом / выводом. Обратите внимание, что это в C ++, но оно должно дать вам хорошее представление о том, как C API висит вместе.