2010-01-10 2 views
0

QueueUserWorkItem() 함수를 사용하여 스레드 풀을 호출합니다.
그리고 나는 그것으로 많은 일을 시도했다. (약 30000)
하지만 작업 관리자가 내 응용 프로그램은 시작 버튼을 누른 후 4 ~ 5 스레드 만 만듭니다.
스레드 제한의 기본 개수가 약 500 개라고 말한 MSDN을 읽었습니다.
왜 응용 프로그램에 스레드가 몇 개 만들어 졌습니까?
저는 응용 프로그램 속도를 높이려고 노력하고 있습니다.이 스레드 풀이 내 응용 프로그램 속도를 늦추는 이유 중 하나입니다.

내 threadspool은 단지 4 ~ 5threads를 만듭니다. 왜?

감사

답변

1

스레드 풀 스케줄러의 작동 방식을 이해하는 것이 중요합니다. 컴퓨터의 기능에 맞춰 스레드를 실행하는 숫자를 미세 조정하기 위해 설계되었습니다. 귀하의 머신은 동시에 2 개의 스레드 만 실행할 수 있으며 듀얼 코어 CPU가 현재의 표준입니다. 어쩌면 4 명.

그래서 무릎에 많은 스레드를 덤프하면 두 개의 스레드 만 활성화됩니다. 나머지는 대기열에 있고 CPU 코어가 사용 가능할 때까지 기다립니다. 이 두 스레드 중 하나가 완료 되 자마자 다른 스레드가 활성화됩니다. 두 번째로, 완료되지 않은 활성 스레드로 진행되는 작업을 평가합니다. 이 스레드는 블로킹 중이므로 진행하지 않고 다른 스레드를 활성화 할 수 있다는 대략적인 가정을합니다. 이제 세 개의 실행 스레드가 생겼습니다. 기본 스레드 최대 수인 500 개의 스레드를 가져 오려면 249 초가 걸릴 것입니다.

분명히이 동작은 스레드가 스레드 풀 스레드로 실행하기에 적합해야 할 사항을 설명합니다. 신속하게 완료되어야하며 자주 차단하지 않아야합니다. I/O 요청에 대한 차단은 별도로 처리됩니다.

이 동작이 적합하지 않은 경우 일반 스레드를 사용할 수 있습니다. 바로 실행을 시작하고 프로그램 (및 운영 체제)의 다른 스레드와 CPU 시간을두고 경쟁하게됩니다. 30,000 개의 스레드를 만들 수는 없으며 가상 메모리를 충분히 사용할 수 없습니다. 32 비트 운영 체제는 2000 개의 스레드에서 남은 곳으로 튀어 나와 사용 가능한 모든 가상 메모리를 사용합니다.페이징 파일이 다 떨어지기 전에 64 비트 운영 체제에서 약 50,000 개의 스레드를 얻을 수 있습니다. 프로덕션 프로그램에서 이러한 한계를 테스트하는 것은 권장되지 않습니다.

+0

예 내 컴퓨터에 4 개의 코어가 있음을 알았습니다. 내 응용 프로그램이 스레드 풀이 없으면 4 배 느리게 실행됩니다. –

0

당신이 스레드가 비용이 매우 이유로 모든 비동기 작업에 대한 스레드를 만들지 않도록 할 수 있도록 스레드가 있습니다. 30,000 개의 쓰레드를 원한다면 쓰레드 스택에 많은 메모리를 사용하고 컨텍스트 스위치를 수행하는 데 많은 CPU 시간을 낭비하게됩니다. 이제 많은 스레드를 만드는 것은 당신이 30,000 개의 CPU 코어를 가지고 있다면 정당화 될 것입니다 ...

1

나는 당신이 쓰레드 풀의 사용에 대해 오해했을 수도 있다고 생각합니다. 스레드를 생성하고 스레드를 죽이는 작업은 Windows 커널과 관련이 있으며 값 비싼 작업입니다. 비동기 작업을 수행하기 위해 지속적으로 스레드가 필요하다면 스레드를 버리면 많은 시스템 호출이 수행됩니다.

실제로 스레드 풀은 으로 생성되는 스레드 그룹입니다. 작업 완료시 종료되는 대신 실제로 queueuserworkitem에 대한 다른 항목 대기를 입력하십시오. 스레드 풀은 프로세스에 동시에 필요한 스레드 수에 따라 조정됩니다. 이 코드를 테스트하려면 다음 코드를 작성하십시오.

for(int i = 0; i < 30000; i++) 
{ 
    ThreadPool.QueueUserWorkItem(myMethod); 
} 

그러면 스레드 전체가 생성됩니다. ThreadPool이 함수 호출을 통해 작업하기 시작할 때 만들어지는 일부 스레드가 다시 사용되므로 30000이 아닐 수도 있습니다.

관련 문제