【问题标题】:Why is OmniThreadLibrary limited to 60 threads when .Net's limit is 32768?为什么 .Net 的限制为 32768 时,OmniThreadLibrary 限制为 60 个线程?
【发布时间】:2012-11-19 16:26:58
【问题描述】:

我最近比较了 .NET 中的 OmniThreadLibrary 和 ThreadPool,我发现 Omni 在最大线程数方面受到更多限制——允许 60 个——而 .NET 可以达到 32768 在 .NET 4.0 中。

为什么会有这样的限制?

【问题讨论】:

  • 可能还有其他原因。那就是堆栈大小。 Delphi 中的默认设置是为每个线程的堆栈分配 1MB 的地址空间。在 32 位进程上,您将遇到大约 1000 个线程数的问题,尽管内存未使用,但仍会引发内存不足异常。这是由于 32 位应用程序的 2.1GB 可用地址空间。
  • @MikeT 顺便说一句,如果您将多进程与 IPC 一起使用,则可以绕过这一点。那么你就可以拥有 60 多个线程。

标签: delphi delphi-xe2 omnithreadlibrary


【解决方案1】:

这是一个历史性的选择,一旦被取消。该限制仅存在于线程池实现中。

the website 上给出了解释,说明如下:

60个并发线程的限制只适用于线程 水池。线程池是为快速执行许多小程序而设计的 请求,而不是作为很少活动线程的存储。

你可以跳过线程池直接使用 OTL 任务。这样你 可以创建数百个。

这个限制的原因是在[OtlTaskControl]TOmniTaskExecutor.WaitForEvent 的深处使用有这个限制的MsgWaitForMultipleObjectsEx。如果真正需要具有超过 60 个并发运行线程的任务池,则可以绕过此限制。

【讨论】:

  • 顺便说一句,链接已失效。 OTL 论坛似乎已经死了。
  • 是的,很遗憾。对此有一个issue report,尽管我对论坛是否或何时恢复没有任何见解。
  • 我是否正确地说此限制适用于 Parallel.For/Foreach 函数?如果是这样,我们需要更改代码以手动创建任务,因为我们需要 > 60 个线程。 OTL 中是否有一种直接的方法来等待一组任务完成(WaitFor 或类似的)?
【解决方案2】:

您可以通过更改以下内容来绕过这些东西:

FD_SETSIZE = 1024Winsock.pas

CMaxConcurrentWorkers = 1024; in OtlThreadPool.pas

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2011-08-18
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多