C #응용 프로그램에서 만들 수있는 최대 스레드 수는 얼마입니까? 이 한도에 도달하면 어떻게됩니까? 던져진 어떤 예외가 있습니까?
고유 한 제한이 없습니다. 최대 스레드 수는 사용 가능한 실제 자원의 양에 의해 결정됩니다. 이것 좀 봐레이몬드 첸의 기사세부 사항.
스레드의 최대 개수가 무엇인지 물어볼 필요가 있다면 아마 뭔가 잘못하고있을 것입니다.
[최신 정보: 관심 부족 : .NET Thread Pool 기본 스레드 수 :
(이 수는 하드웨어 및 OS에 따라 다를 수 있음)]
미치 말이 맞아. 리소스 (메모리)에 따라 다릅니다.
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에서 예외 (메모리 부족)에 중단 점을 넣으십시오. 물론 매우 큰 차이가 있습니다.
나는 C #console을 사용하는 64 비트 시스템에서 테스트를 수행했다. 예외는 2949 스레드를 사용하는 메모리 부족 유형이다.
우리가해야 할 스레딩 풀을 사용해야한다는 것을 알았지 만,이 대답은 주요 질문에 대한 응답입니다;)
시스템에서 얼마나 많은 스레드를 실행할지 결정할 수 있도록 스레드 풀 (또는 비동기 델리게이트, 즉 스레드 풀을 사용)을 사용해야합니다.
C #을 통한 CLR의 Jeff Richter :
"CLR 버전 2.0에서 최대 개수 작업자 스레드의 기본값은 시스템의 CPU 당 25 개입니다. I / O의 최대 수 thread는 기본적으로 1000으로 제한됩니다. 1000의 제한은 사실상 전혀 제한이 없습니다. "
.NET 2.0을 기반으로합니다. 이것은 .NET 3.5에서 변경되었을 수 있습니다.
[편집] @Mitch가 지적했듯이 이는 CLR ThreadPool에만 해당됩니다. 스레드를 직접 작성하는 경우 @Mitch 및 다른 주석을 참조하십시오.