지금 막 mutithreaded 프로그램을 작성하는 법을 배우고 있으며, 프로그램에 얼마나 많은 스레드가 최적인지에 대한 가상의 질문이 있습니다.몇 개의 스레드를 만들까요?
두 가지 시나리오를 설명해 드리겠습니다.
첫 번째 시나리오는 내가 쉽게 멀티 스레드이지만 각 스레드는 많은 작업을 수행 할 것입니다 (각 스레드의 실행 시간은 초 단위 임).
두 번째 시나리오는 내가 쉽게 멀티 스레드이지만 각 스레드는 매우 짧은 실행 시간 (밀리 초 단위)을 가지고 있다는 것입니다.
이러한 시나리오 중 하나에서 프로그램을 mutithreading하는 가장 효율적인 방법은 무엇입니까? 시스템 메모리가 허용하는만큼의 스레드를 생성하는지 또는 새 스레드를 생성하기 전에 스레드가 완료 될 때까지 대기하므로 한 번에 최대 4 개의 작업자 스레드 만 실행됩니다.
한편, 많은 스레드는 스레드 간 코어 전환에 오버 헤드 문제가있을 수 있습니다. 반면에 실행중인 스레드의 수를 제한하면 추가 검사 조건을 실행하고 카운터 변수를 잠그고 잠금을 해제하여 실행중인 스레드 수를 추적하고 이전 스레드가 완료되면 새 스레드를 생성합니다. .
많은 작은 스레드가있는 경우 스레드가 실행되기 전에 너무 많은 스레드 전환이 발생하지 않으므로 가능한 많은 스레드로 시스템을 오버로드하는 것이 가장 좋습니다. 그것은 스레드의 수를 지속적으로 추적하는 오버 헤드를 줄일 수 있습니다.
또한 큰 스레드가 몇 개 밖에없는 경우 (몇 개는 몇 백 개 정도됩니다), 스레드를 추적하여 스레드가 최적의 수로 유지되도록하는 것이 좋습니다. (쓰레드가 끝나기 전에 여러 번 전환하기 때문에 오버 헤드가 더 커질 것이기 때문에) 아주 많은 쓰레드 스위칭이있다.
이러한 가정은 각각의 경우에 대해 정확합니까? 아니면 모든 상황에서 올바른 일을하는 보편적 인 방법이 있습니까?
참고 : 이것은 muti 코어 시스템 (지금은 하이퍼 스레딩을 무시할 수 있음)을 가정하고 mutithreading과 관련된 일반적인 문제를 무시하도록합니다 (모든 스레드가 개인 쓰기 위치를 갖고 있으며 공용 쓰기 위치 만 읽을 수 있다고 가정, 잠금 잠금 해제는 활성 스레드 수에 대해 카운터를 증가 시키거나 감소시킬 때만 발생합니다).
감사합니다, 이것에
-Faken
좋은 지적. 작업이 마이크로 초 동안 실행되면 스레드를 설정하고 실제 작업을 수행하는 데 거의 오랜 시간이 걸립니다! –
또한 C++ 및 Visual Studio 2010을 사용하는 경우 Parallel Pattern Library 및 Concurrency Runtime을 사용할 수 있습니다 (PFX는 .NET 임). .NET 및 C++ 코드에 대한 포인터는 동시성 센터를 참조하십시오. http://msdn.microsoft.com/en-us/concurrency/default.aspx – Rick