我目前正在互联网上搜索自定义线程池实现。 我找到了一个使用IOCP的实现。我想知道使用它们有什么好处?他们提供工作偷窃,或类似的东西,我真的能找到答案......
答案 0 :(得分:7)
IOCP =“IO完成端口”。它是内置于Windows操作系统中的内核对象,可为您提供管理多线程异步IO的智能方法。
在非常简单(有点过于简化)的术语中,您告诉IOCP您想要完成的IO作业。它将异步执行它们并维护每个作业的结果队列。您打电话告诉IOCP有关作业立即返回(当IO发生时它不会阻塞)。您将返回一个概念上类似.NET IAsyncResult的对象...如果您选择,它可以阻止,或者您可以提供回调,或者您可以定期轮询以查看作业是否完整。
在执行这些作业时,IOCP使用线程池。线程池试图将线程数限制为处理器数量或更少(这是可配置的,但意图和默认是将其限制为处理器数量)。但是,IOCP规定了有时这些线程上的任务可能会阻塞的事实。 Asycn IO任务不会阻止,但您可能已经提供了其他类型的任务。因此,您可以为IOCP提供另一个数字......这是一个高于“通常最大值”的线程数,由于其他一个线程被阻止,IOCP被允许进入该线程。目标是达到实际做某事的线程的“通常最大”(即,未被阻止)。如果发生这种情况,那么有一段时间IOCP将使用比通常的max更多的线程,但它会拒绝创建任何新线程,直到它可以回到“通常的最大值”。
这是一个简短的摘要,只是概念性的,正如我所说,在某些方面过度简化。但它应该给你一般的想法。杰弗里里希特关于Windows操作系统的书籍详细介绍了这一点(但这些书已经绝版了)。您可以找到这些使用过的书籍,实际上它们的使用成本比原来高。我认为“高级Windows”是你想要的标题,但可能有一本书的更新版本有不同的标题。
答案 1 :(得分:0)
使用IOCP作为线程池的最大好处是,它监视其线程,并且如果某个线程由于某种原因(包括页面错误,阻止调用等)而阻塞了100毫秒以上,则它会意识到另一个线程由于达到了并发限制而正在等待。我不知道内部实现,但我不认为它使用工作窃取队列。
答案 2 :(得分:-1)
如果您计划在工作线程中使用Windows IO功能,则可以使用IOCP实现。 IO功能可以读/写到磁盘或网络。
检查推送框架http://www.pushframework.com以查看IOCP在实时服务器实施中的用法。