代码之家  ›  专栏  ›  技术社区  ›  Lou

如果使用iocp进行基本信令,将哪个句柄传递给createicompetionport?

  •  1
  • Lou  · 技术社区  · 6 年前

    背景 :如本文所述, 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)
            {
                // 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);
    

    但它只返回空值。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Lou    6 年前

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

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

    FileHandle [in]

    打开的文件句柄或 无效的句柄值 .

    • 句柄必须指向支持重叠I/O的对象。

    • 如果提供了句柄,则必须打开它以完成重叠的I/O。例如,必须指定 FILE_FLAG_OVERLAPPED 使用时标记 CreateFile 函数获取句柄。

    • 如果 无效的句柄值 如果指定,函数将创建一个I/O完成端口,而不将其与文件句柄关联。在这种情况下, ExistingCompletionPort 参数必须为 NULL 以及 CompletionKey 参数被忽略。