Здравствуйте, abdul.zycor,
AZ>Допустим есть ситуация, когда X рабочих потоков, а в очереди Y поставленных запросов, выполнение запроса требует времени Z. AZ>Т.е. скажем очередь не пуста и в данное время необходимо срочно провести деинициализацию. Самое на первый взгляд простое — поставить в очередь AZ>с помощью PostQueuedCompletionStatus некие данные после анализа которых, рабочий поток завершиться. Но вся суть, что AZ>PostQueuedCompletionStatus использует KeInsertQueue, т.е. запрос ставиться в конец очереди. Т.е. необходимо ставить запрос в начало очереди, что-бы AZ>рабочий поток в первую очередь получал уведомление о том, что происходит деинициализация. А так выходит, что пока все предыдущие задания из очереди не будут выбранны, задание о завершении не получить. А деинциализироваться надо, например в случае выгрузки драйвера или при уведомлении от SCM для службы. Ситуация не частая, но бывает. Как выходить из такого положения?
--
Попробуйте использовать CompletionKey при вызове CreateIoCompletionPort как указатель на структуру, внутри которой передавайте глобальные данные всем рабочим потокам. Каждый из рабочих потоков, получив управление после вызова функции GetQueuedCompletionStatus, первым делом должен проверить эти данные и решить, что ему делать.