[C#] C #에서 스레드 풀을 언제 사용합니까? [닫은]

C #에서 멀티 스레드 프로그래밍을 배우려고 노력 중이며 스레드 풀을 사용하는 것이 가장 좋으며 내 스레드를 만드는 것이 가장 혼란 스럽습니다. 한 책은 작은 작업에만 스레드 풀을 사용하는 것이 좋지만 (그것이 무엇이든간에) 실제 지침을 찾을 수없는 것 같습니다. 이 프로그래밍 결정을 할 때 고려해야 할 사항은 무엇입니까?



답변

지속적인 처리가 필요한 논리적 인 작업이 많고 동시에 수행하려면 pool + scheduler를 사용하십시오.

원격 서버 또는 디스크 액세스에서 자료 다운로드와 같은 IO 관련 작업을 동시에 수행해야하지만 몇 분마다 한 번씩 말해야하는 경우, 고유 한 스레드를 작성하고 완료되면 종료하십시오.

편집 : 몇 가지 고려 사항에 대해 데이터베이스 액세스, 물리 / 시뮬레이션, AI (게임) 및 많은 사용자 정의 작업을 처리하는 가상 시스템에서 실행되는 스크립트 작업에 스레드 풀을 사용합니다.

일반적으로 풀은 프로세서 당 2 개의 스레드 (현재 요즘 4 개)로 구성되지만 필요한 수를 알고있는 경우 원하는 스레드 수를 설정할 수 있습니다.

편집 : 자신의 스레드를 만드는 이유는 컨텍스트 변경 때문입니다 (스레드가 메모리와 함께 프로세스 안팎으로 스왑 해야하는 경우). 쓰레드를 사용하지 않을 때와 같이 쓸모없는 컨텍스트 변경이 발생하면 예를 들어 마치 그대로두면 프로그램 성능이 쉽게 절반으로 떨어질 수 있습니다 (예 : 3 개의 휴면 스레드와 2 개의 활성 스레드가 있음). 따라서 다운로드 스레드가 대기 중이면 많은 CPU를 소비하고 실제 응용 프로그램의 캐시를 냉각시킵니다.


답변

다른 언어와 같은 이유로 C #에서 스레드 풀을 사용하는 것이 좋습니다.

실행중인 스레드 수를 제한하거나 스레드를 작성 및 삭제하는 오버 헤드를 원하지 않는 경우 스레드 풀을 사용하십시오.

작은 작업으로 읽는 책은 수명이 짧은 작업을 의미합니다. 1 초 동안 만 실행되는 스레드를 만드는 데 10 초가 걸리는 경우 풀을 사용해야하는 곳입니다 (실제 수치는 무시하고 비율입니다).

그렇지 않으면 단순히 의도 한 작업을 수행하지 않고 스레드를 작성하고 파괴하는 데 많은 시간을 소비합니다.


답변

.Net의 스레드 풀에 대한 요약은 다음과 같습니다. http://blogs.msdn.com/pedram/archive/2007/08/05/dedicated-thread-or-a-threadpool-thread.aspx

게시물에는 스레드 풀을 사용하지 말고 자체 스레드를 대신 시작해야 할 때도 있습니다.


답변

이 무료 전자 책을 읽는 것이 좋습니다.
Josephing by Threading in C #

최소한 “시작하기”섹션을 읽으십시오. 전자 책은 훌륭한 소개를 제공하며 풍부한 고급 스레딩 정보도 포함합니다.

스레드 풀 사용 여부를 아는 것은 시작에 불과합니다. 다음으로 요구에 가장 적합한 스레드 풀을 입력하는 방법을 결정해야합니다.

  • 작업 병렬 라이브러리 (.NET Framework 4.0)
  • ThreadPool.QueueUserWorkItem
  • 비동기 대리인
  • BackgroundWorker

이 전자 책은이 모든 것을 설명하고 그것들을 언제 사용할 것인지 조언하고 나만의 스레드를 만듭니다.


답변

스레드 풀은 스레드 간의 컨텍스트 전환을 줄 이도록 설계되었습니다. 여러 구성 요소가 실행중인 프로세스를 고려하십시오. 이러한 각 구성 요소는 작업자 스레드를 생성 할 수 있습니다. 프로세스에서 스레드가 많을수록 컨텍스트 전환에 더 많은 시간이 낭비됩니다.

이제 각 구성 요소가 스레드 풀에 항목을 큐에 넣는 경우 컨텍스트 전환 오버 헤드가 훨씬 줄어 듭니다.

스레드 풀은 CPU (또는 CPU 코어)에서 수행되는 작업을 최대화하도록 설계되었습니다. 이것이 기본적으로 스레드 풀이 프로세서 당 여러 스레드를 스핀 업하는 이유입니다.

스레드 풀을 사용하지 않으려는 상황이 있습니다. I / O를 기다리거나 이벤트를 기다리는 경우 해당 스레드 풀 스레드를 묶어 다른 사람이 사용할 수 없습니다. 장기 실행 작업을 구성하는 것이 주관적이지만 동일한 아이디어가 장기 실행 작업에 적용됩니다.

Pax Diablo도 좋은 지적입니다. 실을 회전시키는 것은 자유롭지 않습니다. 시간이 걸리고 스택 공간을 위해 추가 메모리를 소비합니다. 스레드 풀은 스레드를 재사용하여이 비용을 상각합니다.

참고 : 스레드 풀 스레드를 사용하여 데이터를 다운로드하거나 디스크 I / O를 수행하는 방법에 대해 질문했습니다. 이를 위해 스레드 풀 스레드를 사용해서는 안됩니다 (위에 설명한 이유로). 대신 비동기 I / O (일명 BeginXX 및 EndXX 메소드)를 사용하십시오. A의 FileStream그 것 BeginRead하고 EndRead. 들어 HttpWebRequest있을 것이라고 BeginGetResponse하고 EndGetResponse. 사용하기가 더 복잡하지만 멀티 스레드 I / O를 수행하는 올바른 방법입니다.


답변

스레드 기아가 발생하기 쉬우므로 처리 과정에서 중요하거나 가변적이거나 알려지지 않은 부분을 차단할 수있는 작업에 대해서는 .NET 스레드 풀에주의하십시오. 스레드 작업에 대해 많은 논리적 추상화를 제공하는 .NET 병렬 확장 사용을 고려하십시오. ThreadPool에서 개선되어야 할 새로운 스케줄러도 포함되어 있습니다. 여기를 참조 하십시오


답변

소규모 작업에만 스레드 풀을 사용하는 한 가지 이유는 제한된 수의 스레드 풀 스레드가 있기 때문입니다. 하나를 오랫동안 사용하면 해당 스레드가 다른 코드에서 사용되지 않습니다. 이 문제가 여러 번 발생하면 스레드 풀이 모두 소모 될 수 있습니다.

스레드 풀을 사용하면 미묘한 영향을 줄 수 있습니다. 예를 들어 일부 .NET 타이머는 스레드 풀 스레드를 사용하며 실행되지 않습니다.