gpt4 book ai didi

c - 如果使用 IOCP 进行基本信号传输,传递给 CreateIoCompletionPort 的句柄是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:11 25 4
gpt4 key购买 nike

背景:如本文所述,Designing Applications for High Performance :

Consider using PostQueueCompletionStatus rather than SetEvent API. The latter boosts the target thread’s priority by 1 which may cause it to preempt something else.

我在 Windows 上使用 C 语言工作,我想将生产者/消费者 fifo 中的信号从 SetEvent/WaitForSingleObject 替换为 IO 完成端口。

原因是我希望生产者线程成为后台/低优先级线程,但是 SetEvent 总是提升消费者线程并且经常挂起我的生产者线程,我想避免这种情况满足一定的延迟要求。

这些方法的检测表明,在使用 SetEvent 通知消费者线程之后,我时不时地在生产者线程中得到大约 50 微秒的延迟,所以如果这是一个便宜的我想我可以试试看。

精简版:我想切换成这样

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。

最佳答案

我找到了答案,我错过了 CreateIoCompletionPort 文档中的以下部分.

第一个参数是 FileHandle,如果不使用它必须设置为 INVALID_HANDLE_VALUE 而不是零。

FileHandle [in]

An open file handle or INVALID_HANDLE_VALUE.

  • The handle must be to an object that supports overlapped I/O.

  • If a handle is provided, it has to have been opened for overlapped I/O completion. For example, you must specify the FILE_FLAG_OVERLAPPED flag when using the CreateFile function to obtain the handle.

  • If INVALID_HANDLE_VALUE is specified, the function creates an I/O completion port without associating it with a file handle. In this case, the ExistingCompletionPort parameter must be NULL and the CompletionKey parameter is ignored.

关于c - 如果使用 IOCP 进行基本信号传输,传递给 CreateIoCompletionPort 的句柄是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53651391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com