118

C#アプリケーションで作成できるスレッドの最大数はいくつですか?そしてこの限界に達するとどうなりますか?ある種の例外がスローされますか?


  • x64 VMまたはx86 VMを実行している場合、答えは異なります。 - Brian R. Bondy
  • 私の状況ではx86ですが、他の誰かがそれを必要とする場合に備えて、両方に答えを提供できますか。 - creedence.myopenid.com

5 답변


131

本質的な制限はありません。最大スレッド数は、利用可能な物理リソースの量によって決まります。これを見てRaymond Chenによる記事詳細については。

最大スレッド数を尋ねる必要がある場合は、おそらく何か問題があります。

[更新:おもしろいことに:.NET Thread Poolのデフォルトのスレッド数:

  • フレームワーク4.0の1023(32ビット環境)
  • Framework 4.0(64ビット環境)では32767
  • Framework 3.5ではコアあたり250
  • Framework 2.0ではコアあたり25

(これらの数字は、ハードウェアとOSによって異なります)


  • どうやってこれを理解しましたか?あなたは.NET 4.5が何であるか、または5.0がどうなるか知っていますか? - random65537
  • それらの数字がどこから来たのか疑問に思う - RollRoll
  • このコードを使用してカウントを取得することができます。int workerThreads; int completionPortThreads; ThreadPool.GetMaxThreads(out workerThreads、out completionPortThreads); - JALLRED
  • @MitchWheatリンクされた記事では.NETについては説明していませんが、わかりやすいCで説明しています。 - pqsk
  • @LoukMo:スレッドを作成できない場合は、おそらくメモリ不足になっているはずです。試したことはありませんが、メモリの例外がスローされることを想定しています。 - Mitch Wheat

24

ミッチは正しいです。リソース(メモリ)に依存します。

Raymondの記事はC#スレッドではなくWindowsスレッド専用ですが、ロジックは同じです(C#スレッドはWindowsスレッドにマップされます)。

しかし、C#にいるので、完全に正確にしたい場合は、「開始」スレッドと「非開始」スレッドを区別する必要があります。実際には、開始スレッドのみがスタックスペースを予約します(予想通り)。開始されていないスレッドは、スレッドオブジェクトに必要な情報のみを割り当てます(実際のメンバーに興味がある場合は、リフレクタを使用できます)。

実際に自分でテストすることができます。

    static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                newThread.Start();
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

と:

   static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

counterの値を確認するには、VSの例外(もちろんメモリ不足)にブレークポイントを設定します。もちろん、非常に大きな違いがあります。


8

私はC#コンソールで64ビットシステム上でテストを行った、例外は2949スレッドを使用して、メモリ不足のタイプです。

私はスレッドプールを使用するべきだと認識していますが、これは主な質問に対する回答です。


5

システムが実行するスレッド数を決定できるように、スレッドプール(または非同期デリゲート、つまりスレッドプールを使用する)を使用する必要があります。


  • -1:スレッドプールはいくつかのコメントで言及されています。 - John Saunders
  • 答えですシステムに決定させるため。 - Ian Boyd
  • @イアン:9か月前に同じ答えが出されたので、私はあなたを軽蔑した。 - John Saunders
  • リンク。誰かの答えとして、スレッドプールについての言及は見当たりません。 - Ian Boyd

4

C#によるCLRのJeff Richter:

"CLRのバージョン2.0では、最大数 ワーカースレッド数のデフォルトは、マシンのCPUごとに25  最大I / O数 スレッドのデフォルトは1000です。1000の制限は事実上まったく制限がありません。」

これは.NET 2.0に基づいています。これは.NET 3.5で変更された可能性があります。

[編集] @Mitchが指摘したように、これはCLR ThreadPoolに固有のものです。スレッドを直接作成している場合は、@ Mitchや他の人のコメントを参照してください。


  • 私はあなたがスレッドプールを参照していると思います。 - Mitch Wheat
  • あなたは.NET 3.5についてのあなたのコメントでCLR 2.0と.NET 2.0を混同しています。 - bzlm
  • 私が知る限り、SP1 for .NET 2.0(.NET 3.5の一部)では、スレッドプールのワーカースレッドのデフォルトはCPU /コアあたり250に変更されています。 - Michael Damatov

リンクされた質問


関連する質問

最近の質問