我描述了一个问题 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/