2010-05-18 6 views
14

필자가 생각하기에 스레드의 이상적인 양은 3 개입니다. 하나는 UI 용이고 다른 하나는 CPU 리소스 용이고 다른 하나는 IO 리소스 용입니다.스레드를 사용해야 할 때

하지만 나는 틀 렸습니다.

나는 그저 소개를 받았지만 항상 UI와 다른 모든 것을 사용했습니다.

언제 스레드를 사용해야합니까? 내가 그들을 사용해야하는지 어떻게 알 수 있습니까?

+3

더 많은 답변을 드릴 수 있지만 UI와 관련하여 처리량이 적을지라도 여러 상황을 고려하여 응답 시간이 길어질 수 있습니다. 예를 들어 웹의 탭로드 브라우저, 탭당 스레드 1 개. 물론 사례별로 다릅니다. – Phil

답변

13

불행히도, 쓰레드를 사용하는 것은 어렵고 빠른 규칙이 없습니다. 스레드가 너무 많으면 프로세서가 모든 시간을 보내고 전환합니다. 스레드를 너무 적게 사용하면 응용 프로그램에서 원하는 처리량을 얻을 수 없습니다. 또한 스레드를 사용하는 것은 쉽지 않습니다. ThreadPool.QueueUserWorkItem과 같은 도구가 있기 때문에 C#과 같은 언어를 사용하면 더 쉽게 사용할 수 있습니다. 이를 통해 시스템은 스레드 생성 및 삭제를 관리 할 수 ​​있습니다. 이렇게하면 작업을 전달할 새 스레드를 만드는 오버 헤드를 줄일 수 있습니다. 쓰래드의 생성은 "무료"로 얻는 연산이 아니라는 것을 기억해야합니다. 스레드를 시작하는 데 드는 비용은 항상 고려해야합니다.

응용 프로그램을 작성하는 데 사용하는 언어에 따라 스레드 사용에 대해 걱정할 필요가있는 양이 결정됩니다. 내가 가장 자주 명시 적으로 스레드를 만드는 고려할 필요가 있음을 발견

시간은 다음과 같습니다

  • 비동기 작업
  • 지속적인 실행 배경 작업
5

SQLite FAQ : "Threads are evil. 피하십시오." 절대적으로해야 할 때만 사용하십시오.

필요한 경우 평소 대용량을 피하기위한 조치를 취하십시오. GUI 프레임 워크 제공 기능을 사용하여 스레드 풀을 사용하여 상호 의존성이없는 세분화 된 작업을 실행하여 결과를 UI로 되돌려 보내십시오. 장기 실행 스레드간에 데이터를 공유하지 마십시오. 메시지 대기열을 사용하여 메시지 대기열 간 정보 전달 (동기화).

이국적인 솔루션은 안전성과 이해 가능성을 희생하지 않고 미세 병렬 처리를 위해 명시 적으로 설계된 Erlang과 같은 언어를 사용하는 것입니다. 동시성 자체는 미래의 계산에있어 근본적으로 중요합니다. 쓰레드는 그것을 표현하기위한 끔찍하고 깨진 방법 일뿐입니다.

+8

은 독단적이지 않습니다. 쓰레드는 스스로 악의가 없습니다. 그것은 UI와 백그라운드 활동 스레드를 분리하는 훌륭한 패턴입니다, 그것은 더 나은 사용자 경험을 제공합니다. – Andrey

+2

+1 : 스레드를 사용하지 않고 빠져 나갈 수 있다면 테스트와 디버깅을 확실히 쉽게 할 수 있으며 장기적으로는 더 안정적인 제품을 만들 수 있습니다. 만약 당신이 * 쓰레드를 사용한다면 현명하게 그렇게하라. –

+2

@Andrey, 내가 아는 가장 똑똑한 사람들은 코드에서 스레드를 사용하는 것에 대해 가장 낙담합니다. 필자가 제공 한 PDF 링크를 따르십시오. –

9

답변은 전적으로 귀하가하려는 계획에 따라 다릅니다. 그러나 CPU 리소스에 대한 문제는 좋지 않습니다. CPU에는 소매 용 CPU에서 최대 6 개의 코어와 하이퍼 스레딩이 포함될 수 있으며 대부분의 CPU에는 2 개 이상의 코어가 있습니다. 이 경우 CPU 코어만큼의 스레드가 있어야하며 사고를 계획하는 데 몇 가지 더 많은 스레드가 있어야합니다. 전체 CPU는 단일 쓰레드 비스트가 아니며 많은 코어가있을 수 있으며 100 % 활용을 위해 많은 스레드가 필요할 수 있습니다.

대상 인구 통계에 거의 모든 코어가 멀티 코어 (현재 데스크탑/랩톱 시장에서와 같이)하고 한 코어의 성능이 충분하지 않다고 판단한 경우에만 스레드를 사용해야합니다.

3

을 병렬화 할 수

  • 운영 "이상적인 스레드 수"는 특정 문제와 얼마나 많은 병렬 처리를 활용할 수 있는지에 달려 있습니다.만약 당신이 "embarassingly parallel"이라는 문제가 있다면, 그들 사이의 통신이 거의없고 독립적 인 문제로 세분화 될 수 있고 실제로 병렬 처리를 할 수있는 충분한 코어를 가지고 있다면 얼마나 많은 스레드를 사용 하는가에 달려 있습니다. 문제의 크기, 캐시 라인 크기, 문맥 전환 및 산란 오버 헤드, 그리고 손으로 계산하기가 정말 어려운 여러 가지 사항이 있습니다. 이러한 상황에서는 스레드 전반에서 문제의 최적 분할/분할을 선택하기 위해 프로파일 링을 수행해야합니다. 코어를 사용하는 것보다 많은 스레드를 사용하는 것은 일반적으로 이해가되지 않습니다. 또한 많은 동기화가있는 경우 실제로 스레드를 사용하면 성능이 저하 될 수 있습니다. 그것은 특정 단계뿐만 아니라 다양한 단계에서 상호 의존성이 얼마나 큰지에 따라 크게 다릅니다. 기본 원리로서 스폰 스레드 및 스레드 동기화는 값 비싼 작업이지만 병렬로 계산을 수행하면 통신 및 다른 형태의 동기화가 최소화되면 처리량이 늘어날 수 있습니다. 스레드가 상호 공유 캐시 라인을 무효로 만들면 스레드 성능이 캐시 성능을 저하시킬 수 있음을 알아야합니다.

  • 5

    Herb Sutter는 Dobb 's Journal의 an article을 작성하여 동시성이라는 세 가지 기둥에 대해 이야기합니다. 이 기사는 스레딩 구성을 통해 해결할 수있는 문제를 해결할 수있는 좋은 방법입니다.

    관련 문제