2010-01-12 12 views
30

스레드 생성과 스레드 풀링 사이의 비교 지점을 나열 할 수 있습니까? .NET 프레임 워크를 두 가지를 모두 지원하는 참조 구현으로 간주하십시오.스레드 풀 대 스레드 산란

+0

"better"는 플랫폼에 따라 다릅니다 – skaffman

답변

21

"pool"에는 사용할 수있는 "스레드"목록이 포함되어 있지만 "spawning"은 실제로 새 스레드를 만드는 것을 의미합니다.

"스레드 풀링"의 유용성은 "시간 단축"에 있습니다. 생성 시간 오버 헤드가 방지됩니다.

"어느 것이 더 낫습니다"는 측면에서 다릅니다. 생성 시간 오버 헤드가 문제라면 스레드 풀링을 사용하십시오. 이는 "단기적인 작업"이 많이 필요한 환경에서 자주 발생하는 문제입니다.


다른 사람들이 지적했듯이 스레드 풀링에 대한 "관리 오버 헤드"가 있습니다. 제대로 구현되면 최소화됩니다. 예 : 풀의 스레드 수를 제한하는 것은 간단합니다.

+1

대기열에서 작업을 선택하고 풀에서 스레드에 할당하는 것과 비교하여 새 스레드를 만드는 데 큰 차이가 있습니다 (시간 소비 측면에서) Windows XP에서 OS? – reonze

+0

나는 심각한 Windows 프로그래밍을 해본 적이 없지만 목록 (사용 가능한 작업)에서 사용 가능한 스레드를 선택하는 것이 새 스레드를 생성하는 것보다 훨씬 저렴하다고 확신합니다. – jldupont

+2

새로운 물리적 스레드를 생성하면 커널 모드로 전환되고 많은 커널 구조를 설정하므로 오버 헤드가 높아집니다. 그러나 우리 모두 알고 있듯이 조기에 최적화해서는 안됩니다.하나의 쓰레드 만 생성한다면 오버 헤드를 알아 차리지 못할 것입니다. 아마도 수천을 생성한다면 아마도 쓰레드를 만들고있는 작업에 달려 있습니다. 쓰레드를 만드는 데 걸리는 시간이 줄어들 것입니다. –

1

다른 스레드에서 실행하려는 내용에 따라 다릅니다.

짧은 작업의 경우 스레드 풀을 사용하는 것이 더 좋습니다. 긴 작업의 경우 새 스레드를 생성하는 것이 더 좋을 수 있으므로 다른 작업을 위해 스레드 풀이 굶어 죽을 수 있습니다.

+1

성능 분석 및 로깅에 유용하여 생성 된 스레드의 이름을 바꿔 성능 분석을 쉽게 할 수 있습니다. 스레드 풀이면 어떤 스레드가 어떤 작업에 속하는지 추측하기가 더 어려워집니다. – weismat

9

"더 나은"정의에 대해서는 일반적으로 스레드 풀로 가고 싶습니다. 사용 사례가 무엇인지 알지 못하면 스레드 풀에서 시작할 때 만들 수있는 고정 된 수의 스레드가 있거나 필요에 따라 만들 수 있습니다 (그러나 스레드 수가 풀 크기를 초과 할 수 없음). 작업이 제출되고 사용 가능한 스레드가없는 경우이를 처리 할 수있는 스레드가있을 때까지 대기열에 넣습니다.

요청 또는 다른 종류의 트리거에 대한 응답으로 스레드를 생성하는 경우 생성되는 스레드의 양을 제한 할 수 없으므로 모든 리소스가 고갈 될 위험이 있습니다.

스레드 풀링의 또 다른 이점은 재사용된다는 것입니다. 매번 새로운 스레드를 생성 할 필요없이 동일한 스레드가 여러 작업을 처리하기 위해 반복적으로 사용됩니다.

다른 사람들에 의해 지적 되었 듯이 오랜 시간 동안 실행되는 작은 수의 작업이있는 경우 빈번한 스레드 생성을 피함으로써 얻을 수있는 이점을 무효화합니다 (어쨌든 많은 양의 스레드를 생성 할 필요가 없기 때문에).).

+2

스폰 된 스레드의 수를 제한 할 수있는 이유가 없습니다. –

+1

사실, 그건 불가능하다고 주장하지 않았습니다. 그렇다면 수영장을 이용하지 않는 이유는 무엇입니까? – danben

+0

글쎄, '일반적으로'비교적 오래 실행중인 작업 (아무것도 몇 초 동안, 정말)입니다. (Ab) 스레드 풀을 사용하여 장기 실행 작업을 수행하면 교착 상태가 발생할 수 있습니다. –

2

가장 큰 차이점은 스레드 풀은 이미 스핀 업되어 사용 가능한 스레드 세트를 유지한다는 것입니다. 새 스레드 시작은 프로세서별로 많은 비용이 듭니다.

그러나 ThreadPool이 스레드를 "스폰"해야하는 경우 ... 일반적으로 작업 부하에 따라 달라집니다. 수행해야 할 작업이 많으면 좋은 스레드 풀이 새 스레드를 회전시켜 부하를 처리합니다. 구성 및 시스템 자원.

5

모두 시나리오에 따라 다릅니다. 새 스레드를 만드는 것은 리소스를 많이 사용하고 값 비싼 작업입니다. 대부분의 매우 짧은 비동기 작업 (최대 몇 초 미만)은 스레드 풀을 사용할 수 있습니다.

백그라운드에서 실행하려는 장기 실행 작업의 경우 일반적으로 자신의 스레드를 생성 (생성)합니다. (Ab)는 장기 실행 작업을위한 플랫폼/런타임 내장 스레드 풀을 사용하면 교착 상태 등의 심한 형태로 이어질 수 있습니다.

0

스레드 생성/생성에 약간의 시간이 필요합니다. 여기서 스레드 폴링은 이미 사용할 준비가 된 생성 된 스레드를 포함합니다.

4

내 느낌은 필요에 따라 스레드를 만들어야한다는 것입니다.이 성능이 정상이라면, 끝났습니다. 어떤 시점에서 스레드 생성과 관련된 대기 시간이 짧다는 것을 발견하면 일반적으로 스레드 풀에 아무 것도하지 않고 드롭 할 수 있습니다.

25

스레드 풀 스레드는 일반 스레드보다 훨씬 저렴하므로 필요한 시스템 리소스를 풀링합니다 스레드에 대한. 그러나 그들이 부적당 할 수 제한 수 있습니다

  • 당신은 스레드 스레드
  • 스레드 풀을 완료 감지하는 쉬운 방법이 없습니다 중단 할 수를 더 Thread.join를하지 않습니다()가
  • 당신은
  • 는 스레드 스레드가 몇 초 이상 실행하지 않아야 메시지 상자를 넘어 스레드 스레드에서 UI의 종류를 표시 할 수 없습니다
  • 스레드 풀 스레드에서 예외를 마샬링 할 쉬운 방법은 없습니다
  • 스레드 풀 스레드가

후자의 두 가지 제약이 스레드 스케줄러의 부작용입니다 오랜 시간 동안 차단하지 않아야, 당신의 CPU를 사용할 수있다 코어의 수와 활성 스레드의 수를 제한하려고합니다. 자주 차단하는 많은 장기 실행 스레드를 예약하면 긴 지연이 발생할 수 있습니다.

많은 다른 스레드 풀 구현에는 비슷한 제약 조건이 있습니다.

+2

이 답변은 전적으로 언어/플랫폼에 따라 다르지만 일반적인 대답 인 것처럼 말로 표현됩니다. OP가 플랫폼도 언어도 언급하지 않았으므로 -1 –

+0

에 동의합니다. – Rubyrider

1

스레드 풀링은 일반적으로 앞쪽으로 만들어지고 필요에 따라 사용되기 때문에 일반적으로 더 나은 것으로 간주됩니다. 따라서 상대적으로 짧은 작업을 위해 많은 스레드를 사용하는 경우 훨씬 빠릅니다. 이는 향후 사용을 위해 저장 되었기 때문에 파괴되지 않고 나중에 다시 생성되기 때문입니다.

반면에 2-3 개의 스레드 만 필요하고 한 번만 생성되면 더 좋을 것입니다. 이는 나중에 사용할 수 있도록 기존 스레드를 캐싱하지 못하고 사용되지 않을 수있는 여분의 스레드를 작성하지 않기 때문입니다.

0

answer 좋은 요약 한 것입니다하지만 단지의 경우, 여기에 위키 백과에 대한 링크입니다 :

실행, 또는 감지 할 수있는 쉬운 방법에서 반환 값을 얻기과 결합 된 멀티 스레드 실행에 대한 http://en.wikipedia.org/wiki/Thread_pool_pattern