最近、.NETにあるOmniThreadLibraryとThreadPoolを比較しましたが、Omniは最大スレッド数がはるかに制限されており(60が許可されています)、.NETは.NET4.0では最大32768になります。
なぜそのような制限?
最近、.NETにあるOmniThreadLibraryとThreadPoolを比較しましたが、Omniは最大スレッド数がはるかに制限されており(60が許可されています)、.NETは.NET4.0では最大32768になります。
なぜそのような制限?
一度解除されるかもしれない歴史的な選択です。制限は、スレッドプールの実装にのみあります。
説明はウェブサイトに記載されており、次のように述べています。
60 の同時スレッドの制限は、スレッド プールにのみ適用されます。スレッド プールは、めったにアクティブでないスレッドのストレージとしてではなく、多くの小さな要求を高速に実行するように設計されています。
スレッドプールをスキップして、OTL タスクを直接使用できます。そうすれば、何百ものそれらを作成できます。
この制限の理由は、内部で[OtlTaskControl]TOmniTaskExecutor.WaitForEvent
この制限のある MsgWaitForMultipleObjectsEx を使用しているためです。同時に実行されるスレッドが 60 を超えるタスク プールが本当に必要な場合は、この制限を回避できます。
以下を変更することで、このようなことを回避できます。
FD_SETSIZE = 1024
の Winsock.pas
CMaxConcurrentWorkers = 1024;
のOtlThreadPool.pas