web-dev-qa-db-ja.com

.NETアプリのスレッドの最大数は?

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

127

固有の制限はありません。スレッドの最大数は、使用可能な物理リソースの量によって決まります。詳細については、こちらをご覧ください Raymond Chenによる記事 詳細.

スレッドの最大数を尋ねる必要がある場合は、おそらく何か間違ったことをしている可能性があります。

[Update:興味がない:.NETスレッドプールのデフォルトのスレッド数:

  • Framework 4.0の1023(32ビット環境)
  • Framework 4.0の32767(64ビット環境)
  • Framework 3.5のコアあたり250
  • Framework 2.0のコアあたり25

(これらの数値は、ハードウェアとOSによって異なる場合があります)]

137
Mitch Wheat

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

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)
        {
        }
    }

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

25
antonio

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

私はスレッドプールを使用する必要があることを理解していますが、これは私が行いますが、この答えは主な質問に対する回答です;)

8
MadApples

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

6
Ian Boyd

C#を介したCLRのJeff Richter:

「CLRバージョン2.0では、マシンのCPUあたりのワーカースレッドの最大数はデフォルトで25であり、I/Oスレッドの最大数はデフォルトで1000です。1000の制限は事実上無制限です。」

これは.NET 2.0に基づいていることに注意してください。これは.NET 3.5で変更された可能性があります。

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

4
Ash