ZBLOG

HANDLE hIOCP = INVALID_HANDLE_VALUE;//IO Completion Port(输入输出完成端口) hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 1);//epoll的区别 多线程 epoll单线程 HANDLE hThread = (HANDLE)_beginthread(threadQueueEntry, 0, hIOCP); //getchar(); ...

你提供的代码片段展示了如何使用 I/O 完成端口(IOCP)在 Windows 中进行多线程异步 I/O 操作。以下是代码的逐步解释和一些关键点:

代码分析

  1. 创建 IO 完成端口

    1. HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 1);

    CreateIoCompletionPort 函数用于创建一个新的 I/O 完成端口。在这个例子中,传入 INVALID_HANDLE_VALUE 表示不与任何文件句柄关联。

  2. 创建工作线程

    1. HANDLE hThread = (HANDLE)_beginthread(threadQueueEntry, 0, hIOCP);

    _beginthread 用于启动一个新的线程,该线程将执行 threadQueueEntry 函数,并传递 hIOCP 作为参数。

  3. 主循环

    1. ULONGLONG tick = GetTickCount64();
    2. while (_kbhit() != 0)
    3. {
    4. if (GetTickCount64() - tick > 1300)
    5. {
    6. PostQueuedCompletionStatus(hIOCP, sizeof(IOCP_PARAM), (ULONG_PTR)new IOCP_PARAM(IocpListPop, "hello world"), NULL);
    7. tick = GetTickCount64();
    8. }
    9. if (GetTickCount64() - tick > 2000)
    10. {
    11. PostQueuedCompletionStatus(hIOCP, sizeof(IOCP_PARAM), (ULONG_PTR)new IOCP_PARAM(IocpListPush, "hello world"), NULL);
    12. tick = GetTickCount64();
    13. }
    14. Sleep(1);
    15. }

在这个循环中,程序检查键盘是否被按下(_kbhit()),如果是,它会每隔一定时间(1300ms 和 2000ms)向完成端口发送任务。这些任务通过 PostQueuedCompletionStatus 函数提交到 I/O 完成端口。

  1. 唤醒完成端口并清理资源

    1. if (hIOCP != NULL)
    2. {
    3. PostQueuedCompletionStatus(hIOCP, 0, NULL, NULL);
    4. WaitForSingleObject(hThread, INFINITE);
    5. }
    6. CloseHandle(hIOCP);

    当退出循环后,程序会向完成端口发送一个特殊信号来唤醒处理线程,然后等待该线程结束,最后关闭完成端口句柄以释放资源。

注意事项

  • 确保在其他地方定义了 threadQueueEntry 函数和 IOCP_PARAM 类/结构,以便正确处理从完成端口接收的请求。
  • 使用动态分配内存时,请确保在适当的时候释放它以防止内存泄漏。
  • 错误处理也很重要,例如检查函数调用的返回值并采取相应措施。

总结

此代码实现了一个基本的基于 I/O 完成端口的多线程框架,用于处理异步I/O请求。你可以在此基础上进一步扩展功能,如添加具体的 I/O 操作、错误处理等。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22109

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?