118

C #응용 프로그램에서 만들 수있는 최대 스레드 수는 얼마입니까? 이 한도에 도달하면 어떻게됩니까? 던져진 어떤 예외가 있습니까?


  • x64 VM 또는 x86 VM에서 실행중인 경우 대답이 다릅니다. - Brian R. Bondy
  • 내 상황은 x86입니다.하지만 다른 사람이 필요로 할 경우를 대비하여 두 가지 모두에 대한 답을 제공 할 수 있습니까? - creedence.myopenid.com

5 답변


131

고유 한 제한이 없습니다. 최대 스레드 수는 사용 가능한 실제 자원의 양에 의해 결정됩니다. 이것 좀 봐레이몬드 첸의 기사세부 사항.

스레드의 최대 개수가 무엇인지 물어볼 필요가 있다면 아마 뭔가 잘못하고있을 것입니다.

[최신 정보: 관심 부족 : .NET Thread Pool 기본 스레드 수 :

  • Framework 4.0 (32 비트 환경)의 1023
  • Framework 4.0 (64 비트 환경)의 32767
  • 프레임 워크 3.5에서 코어 당 250 개
  • Framework 2.0에서 코어 당 25 개

(이 수는 하드웨어 및 OS에 따라 다를 수 있음)]


  • 어떻게 알아 낸거야? .NET 4.5가 무엇인지 또는 5.0이 무엇인지 알고 있습니까? - random65537
  • 그 숫자가 어디서 왔는지 궁금해. - RollRoll
  • 이 코드를 사용하여 카운트를 얻을 수 있습니다. int workerThreads; int completionPortThreads; ThreadPool.GetMaxThreads (밖으로 workerThreads, outPortPortThreads); - JALLRED
  • @MitchWheat 링크 된 기사가 .NET에 대해서는 이야기하지 않았기 때문에 나 자신을 궁금해했다. - 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)
        {
        }
    }

물론 카운터의 값을 보려면 VS에서 예외 (메모리 부족)에 중단 점을 넣으십시오. 물론 매우 큰 차이가 있습니다.


8

나는 C #console을 사용하는 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의 최대 수 thread는 기본적으로 1000으로 제한됩니다. 1000의 제한은 사실상 전혀 제한이 없습니다. "

.NET 2.0을 기반으로합니다. 이것은 .NET 3.5에서 변경되었을 수 있습니다.

[편집] @Mitch가 지적했듯이 이는 CLR ThreadPool에만 해당됩니다. 스레드를 직접 작성하는 경우 @Mitch 및 다른 주석을 참조하십시오.


  • 나는 당신이 threadpool을 언급하고 있다고 생각합니다. - Mitch Wheat
  • .NET 3.5에 대한 귀하의 의견에 CLR 2.0 및 .NET 2.0을 혼란스럽게합니다. - bzlm
  • 내가 아는 한 .NET 2.0 (.NET 3.5의 일부) SP1은 기본적으로 작업자 스레드를 스레드 풀의 CPU / 코어 당 250 개로 변경했습니다. - Michael Damatov

연결된 질문


관련된 질문

최근 질문