gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:31:21 24 4
gpt4 key购买 nike

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

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