背景
:如本文所述,
Designing Applications for High Performance
:
考虑使用
PostQueueCompletionStatus
而不是
SetEvent
应用程序编程接口。后者将目标线程的优先级提高1,这可能导致它抢占其他线程。
我在Windows上的C语言中工作,我想替换生产者/消费者FIFO中的信令
间搞鬼
/
WaitForSingleObject
到IO完成端口。
原因是我希望生产者线程是后台/低优先级线程,但是
间搞鬼
总是提升使用者线程,并经常挂起生产者线程,我希望避免这种情况以满足某些延迟需求。
这些方法的检测表明,在使用
间搞鬼
如果这是一个廉价的替代品,我想我可以试试。
短版
:我想换这种东西
void Produce(int some_item)
{
Enqueue(some_item);
SetEvent(hndEvent);
}
void Consume(void)
{
while (true)
{
if (WaitForSingleObject(hndEvent, INFINITE) == WAIT_OBJECT_0)
{
}
}
}
我想是这样的:
void Produce(int some_item)
{
Enqueue(some_item);
unsigned long evt = 1;
PostQueuedCompletionStatus(hndIOCP, 0, evt, NULL);
}
void Consume(void)
{
while (true)
{
unsigned long evt;
LPOVERLAPPED ovlp;
if (!GetQueuedCompletionStatus(hndIOCP, NULL, &evt, &ovlp, INFINITE))
break;
}
}
但是,由于我不使用这个iocp来处理信号之外的任何事情,我应该传递给哪个句柄
CreateIoCompletionPort
?
我想我只会做如下的事情:
hndIOCP = CreateIoCompletionPort(NULL, NULL, 0, 1);
但它只返回空值。