Сегодня я узнал, что я могу назвать CreateIoCompletionPort()
, а затем передать возвращенное HANDLE
в WaitForSingleObject()
:WaitForSingleObject() на порт завершения?
#include <Windows.h>
int main()
{
HANDLE h = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);
auto bRes = PostQueuedCompletionStatus(h, 1, 2, 0);
if (!bRes) {
abort();
}
auto dwRes = WaitForSingleObject(h, INFINITE);
if (dwRes != WAIT_OBJECT_0){
abort();
}
LPOVERLAPPED pOvr;
DWORD cb;
ULONG_PTR key;
bRes = GetQueuedCompletionStatus(
h, &cb, &key, &pOvr, INFINITE); // <-- returns 1, 2, nullptr
if (!bRes) {
abort();
}
dwRes = WaitForSingleObject(h, INFINITE); // <-- blocks here
return 0;
}
Он работает, как ожидается, на моем Windows 10 коробки.
Является ли такое поведение известным или законным или документированным? Я ничего не смог найти.
'dwRes = WaitForSingleObject (h, INFINITE); // <- блокирует здесь' - действительно блокируется? ты уверен ? просто интересно – RbMm
Да. Сброс дампа в состоянии ожидания и исходный код здесь: https://1drv.ms/f/s!AtyOp6RRUTUTC2CAVzWdFrvZu6w –
Да, в win10 действительно ждут заголовок диспетчера KQUEUE. но сказать в win8.1 - нет. – RbMm