Справочная информация : Как описано в этой статье, Разработка приложений для высокой производительности :
Рассмотрите возможность использования PostQueueCompletionStatus
вместо SetEvent
API.Последний увеличивает приоритет целевого потока на 1, что может привести к вытеснению чего-то еще.
Я работаю в C на Windows, и я хотел бы заменить сигнализацию в fifo производителя / потребителя с SetEvent
/ WaitForSingleObject
на порты завершения ввода-вывода.
Причина в том, что я хочу, чтобы поток производителя был фоновым потоком / потоком с низким приоритетом, но SetEvent
всегда повышает потребительский поток и очень часто приостанавливает мой поток производителя, которого я хотел бы избежать, чтобы встретить определенныетребования к задержке.
Инструментарий для этих методов показывает, что время от времени я получаю задержки порядка ~ 50 микросекунд в потоке производителя, сразу после уведомления потока потребителя с помощью SetEvent
, так что если это дешевая замена, яЯ подумал, что могу попробовать.
Короткая версия : Я хочу переключить что-то вроде этого
void Produce(int some_item)
{
Enqueue(some_item);
SetEvent(hndEvent);
}
void Consume(void)
{
while (true)
{
if (WaitForSingleObject(hndEvent, INFINITE) == WAIT_OBJECT_0)
{
// consume
}
}
}
на что-то вроде этого, я думаю:
void Produce(int some_item)
{
Enqueue(some_item);
unsigned long evt = 1; // "item enqueued"
PostQueuedCompletionStatus(hndIOCP, 0, evt, NULL);
}
void Consume(void)
{
while (true)
{
unsigned long evt;
LPOVERLAPPED ovlp;
if (!GetQueuedCompletionStatus(hndIOCP, NULL, &evt, &ovlp, INFINITE))
break;
// consume
}
}
Но так как я не использую этот IOCP для чего-либо, кроме сигнализации, какую ручку я должен передать CreateIoCompletionPort
?
Я думал, что просто сделаю что-то вроде:
// single thread IOCP
hndIOCP = CreateIoCompletionPort(NULL, NULL, 0, 1);
но он просто возвращает NULL.