c++ - IO 完成端口与线程池 API

标签 c++ multithreading winapi threadpool

我描述了一个问题 here ,建议我使用 IO 完成端口或线程池。

我已经实现了 IO 完成,调用 PostQueuedCompletionStatus 使任务入队,并调用 GetQueuedCompletionStatus 获取下一个任务来执行它。我将 IO 完成端口用作没有显式锁定的多生产者/多消费者线程安全 FIFO 容器。这使我可以完全控制线程,因为我可能需要长时间终止那些进程并报告它们。如果没有剩余任务,GetQueuedCompletionStatus 也会等待调用线程。

除了终止,线程池满足我的需要:我的任务完成不到一毫秒,但有很多。调用 QueueUserWorkItem 并让操作系统进行同步和执行也更简单。

两种方法在性能方面有什么区别吗?对我的实现有何评论?

最佳答案

完成端口旨在避免不必要的上下文切换。当调用 GetQueuedCompletionStatus 的线程处理完工作项时,它可以立即回调 GetQueuedCompletionStatus 以在其当前 CPU 时间片内继续获取更多工作。

@Jonathan - 如果您有阻塞调用,那么这些调用几乎永远不会在拉取工作项的线程上进行。它们应该异步执行(使用 Begin/End 或 *Async 调用)或在另一个线程(工作线程池)上阻塞。这将确保为完成端口提供服务的所有线程实际上都在工作,而不是在其他工作项可用时浪费时间阻塞。

稍微澄清一下:如果您正在管理自己的线程并调用 GetQueuedCompletionStatus,那么您已经创建了自己的完成端口,与操作系统用于异步 IO 调用的 IO 完成端口和关联线程池分开。

关于c++ - IO 完成端口与线程池 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510190/

相关文章:

c++ - 当一个对象的死亡导致另一个对象生病时如何保持封装

java - 从作为后台作业运行的 shell 脚本生成进程

android - 如何停止一个线程?

multithreading - 如何在Perl中唤醒线程

用于创建用户配置文件的 Windows API

c++ - 基于宽度的qt中的字符串截断

c++ - 无效使用 void 表达式,怎么办?

c++ - 无法理解为什么我的程序会抛出错误

c++ - 通过 Winapi 以编程方式编辑 Windows 审核策略时出现权限错误

winapi - 如何查看桌面堆上的内容