C # 응용 프로그램에서 만들 수있는 최대 스레드 수는 얼마입니까? 이 한계에 도달하면 어떻게됩니까? 어떤 종류의 예외가 발생합니까?
답변
고유 한 제한이 없습니다. 최대 스레드 수는 사용 가능한 물리적 리소스의 양에 따라 결정됩니다. 자세한 내용은 Raymond Chen 의이 기사를 참조하십시오 .
최대 스레드 수를 물어보아야 할 경우 문제가있는 것일 수 있습니다.
[ 업데이트 : 관심의 대상 : .NET 스레드 풀 기본 스레드 수 :
- Framework 4.0의 1023 (32 비트 환경)
- Framework 4.0 (64 비트 환경)의 32767
- Framework 3.5의 코어 당 250
- Framework 2.0의 코어 당 25 개
(이 수치는 하드웨어 및 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 # 콘솔을 사용하여 64 비트 시스템에서 테스트를 수행했지만 예외는 2949 스레드를 사용하여 메모리 부족입니다.
스레딩 풀을 사용해야한다는 것을 알고 있지만이 대답은 주요 질문에 대한 답변입니다.)
답변
시스템이 실행할 스레드 수를 결정할 수 있도록 스레드 풀 (또는 스레드 풀을 사용하는 비동기 델 게이트)을 사용해야합니다.
답변
C #을 통한 CLR의 Jeff Richter :
“CLR 2.0 버전의 경우 최대 작업자 스레드 수는 기본적으로 시스템의 CPU 당 25 개이고 최대 I / O 스레드 수는 1000 개입니다. 1000 개는 사실상 제한이 없습니다.”
이것은 .NET 2.0을 기반으로합니다. 이것은 .NET 3.5에서 변경되었을 수 있습니다.
[편집] @Mitch가 지적했듯이 이것은 CLR ThreadPool에만 해당됩니다. 스레드를 작성하는 경우 @Mitch 및 기타 주석을 직접 참조하십시오.
답변
이 코드를 사용하여 테스트 할 수 있습니다 .
private static void Main(string[] args)
{
int threadCount = 0;
try
{
for (int i = 0; i < int.MaxValue; i ++)
{
new Thread(() => Thread.Sleep(Timeout.Infinite)).Start();
threadCount ++;
}
}
catch
{
Console.WriteLine(threadCount);
Console.ReadKey(true);
}
}
32 비트 및 64 비트 응용 프로그램 모드를주의하십시오.
답변
ThreadPool.GetMaxThreads 메소드를 디버그에서 실행하는 것이 좋습니다.
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);