1

我目前正在互联网上搜索自定义线程池实现。我找到了一个使用 IOCP 的实现。我想知道使用它们有什么好处?他们是否提供工作窃取或类似的东西,我真的可以找到答案......

4

2 回答 2

8

IOCP = "IO 完成端口"。它是内置在 Windows 操作系统中的内核对象,可为您提供管理多线程异步 IO 的智能方法。

用非常简单(而且有点过于简单)的术语,你告诉 IOCP 你想要完成的 IO 工作。它将异步执行它们并维护每个作业结果的队列。您告诉 IOCP 工作的电话会立即返回(在 IO 发生时它不会阻塞)。您将返回一个概念上类似于 .NET IAsyncResult 的对象......如果您选择阻止,它可以让您阻止,或者您可以提供回调,或者您可以定期轮询以查看作业是否完成。

在执行这些工作时,IOCP 使用线程池。线程池尝试将线程数限制为处理器数量或更少(这是可配置的,但意图和默认设置是将其限制为处理器数量)。但是,IOCP 规定,有时这些线程上的任务可能会阻塞。Asycn IO 任务不会阻塞,但您可能已经为其提供了其他类型的任务。因此,您可以给 IOCP 另一个数字……这是高于“通常最大值”的线程数,由于其他线程之一被阻塞,IOCP 被允许上升到该数值。目标是使实际执行某事(即未阻塞)的线程达到“通常最大值”。如果发生这种情况,那么 IOCP 将在一段时间内使用比通常的最大值更多的线程,

这是一个简短的总结,只是概念性的,正如我所说,在某些方面过于简化了。但它应该给你一个大致的想法。Jeffrey Richter 关于 Windows 操作系统的书籍详细介绍了这一点(但这些书籍现在已绝版)。你会发现这些书被使用过,而且它们的使用成本实际上比原来的要高。我认为“Advanced Windows”是您想要的标题,但该书的更新版本可能具有不同的标题。

于 2009-03-25T06:19:23.033 回答
0

将 IOCP 用于线程池的最大好处是,它监视其线程,如果一个线程由于某种原因(包括页面错误、阻塞调用等)阻塞超过 100 毫秒,它会重新启动另一个由于达到并发限制而正在等待的线程。我不知道内部实现,但我不认为它使用工作窃取队列。

于 2019-01-25T19:43:24.660 回答