2011-08-11 3 views
4

내 프로그램에서 한 번에 20 개의 스레드가 실행 중입니다. 20 개의 스레드가 완료 될 때까지 기다렸다가 다른 20 개를 시작합니다. 잠시 후 프로그램이 느려집니다. 작업을 해방하거나 특별한 일을해야합니까? 만약 그렇다면, 그렇게하지 않으면 일반적인 프로그램이 왜 느려지 는가?스레드를 "비우는"방법

+0

스레드 풀 스레드입니까, 아니면 명시 적으로 관리하고 있습니까? – drharris

+0

당신은 어떻게 thrads를 만드나요? – Mehran

+0

가능한 dup : http://stackoverflow.com/questions/6960520/when-to-dispose-cancellationtokensource/6961264#6961264 –

답변

12

ThreadPool을 직접 사용하거나 Task Parallel Library (내 선호 옵션)을 통해 사용하는 것이 좋습니다. 이것은 자신의 스레드를 생성하고 반복적으로 블록하는 것보다 더 좋고, 간단하고, 더 깔끔한 디자인 일 가능성이 높습니다.

즉, 프로그램이 점진적으로 느려지는 경우 프로파일 러가 크게 도움이 될 수 있습니다. 코드를 보지 않으면 진단하기가 매우 어렵습니다. 예를 들어, 수행중인 작업에 따라 GC의 시간이 지남에 따라 효율성이 떨어지게되어 프로그램이 계속 실행될 때 GC가 오르는 시간이 길어질 수 있습니다. 프로파일 링은 프로그램이 실행될 때 무엇이 ​​시간을 들여야 하는지를 잘 보여줍니다.

1

리드의 답변은 아마도 문제를 해결하는 가장 좋은 방법 일 것입니다. 그러나 스레드를 직접 관리하고 ThreadPool 또는 TPL을 사용하지 않으려는 경우 왜 20 개의 스레드가 죽고 20 개 이상을 만들지 묻는 것이 좋습니다. 스레드를 만드는 것은 값 비싼 프로세스이므로 스레드 풀이있는 이유입니다. 계속 동일한 수의 병렬 작업 또는 최대 수를 지속적으로 사용하는 경우 한 번 생성하여 다시 사용해야합니다. 세마포어 및 뮤텍스와 같은 잠금 구조를 사용하고 스레드가 완료 될 때까지 대기하게하고 함께 작업 할 새로운 데이터를 제공하고 스레드를 다시 릴리스하여 다시 진행할 수 있습니다. 자물쇠를 기다리는 것은 매우 저렴한 작업입니다. 스레드를 다시 만드는 것보다 훨씬 저렴한 주문입니다.

그래서 예를 들어, 실이 (의사)과 같습니다

while (program_not_ending) 
{ 
    wait_for_new_data_release;  // Wait on thread's personal mutex 

    process_new_data; 

    resignal_my_mutex;    // Cause the beginning of loop to wait again 

    release_semaphore_saying_I_am_done; // Increment parent semaphore count 
} 
의 세마포어, 20 개 스레드가 완료되었는지 채워 데이터 버킷을 재설정하고 모든 취소에 대한

부모는 기다릴 것 thread mutexes.

관련 문제