내 프로그램에서 한 번에 20 개의 스레드가 실행 중입니다. 20 개의 스레드가 완료 될 때까지 기다렸다가 다른 20 개를 시작합니다. 잠시 후 프로그램이 느려집니다. 작업을 해방하거나 특별한 일을해야합니까? 만약 그렇다면, 그렇게하지 않으면 일반적인 프로그램이 왜 느려지 는가?스레드를 "비우는"방법
답변
ThreadPool
을 직접 사용하거나 Task Parallel Library (내 선호 옵션)을 통해 사용하는 것이 좋습니다. 이것은 자신의 스레드를 생성하고 반복적으로 블록하는 것보다 더 좋고, 간단하고, 더 깔끔한 디자인 일 가능성이 높습니다.
즉, 프로그램이 점진적으로 느려지는 경우 프로파일 러가 크게 도움이 될 수 있습니다. 코드를 보지 않으면 진단하기가 매우 어렵습니다. 예를 들어, 수행중인 작업에 따라 GC의 시간이 지남에 따라 효율성이 떨어지게되어 프로그램이 계속 실행될 때 GC가 오르는 시간이 길어질 수 있습니다. 프로파일 링은 프로그램이 실행될 때 무엇이 시간을 들여야 하는지를 잘 보여줍니다.
리드의 답변은 아마도 문제를 해결하는 가장 좋은 방법 일 것입니다. 그러나 스레드를 직접 관리하고 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.
- 1. 는 클러킹을위한 스레드를 생성하고 다시 다른 스레드를
- 2. 재귀 적으로 스레드를 생성 할 때 스레드를 추적하십시오.
- 3. Windows Forms - 별도의 스레드를 걷어 내고 현재 스레드를 유지하는 방법
- 4. 메인 스레드를 종료 할 때 어떻게 자식 스레드를 종료합니까?
- 5. 활성 포럼 스레드를 나열하십시오
- 6. Java에서 스레드를 닫는 방법?
- 7. 도와주세요. 스레드를 생성 및
- 8. SslStream.ReadByte()가 스레드를 차단합니까?
- 9. PageAsyncTask가 자체 스레드를 실행합니까?
- 10. 이름으로 스레드를 가져옵니다.
- 11. 스레드를 통해 컨트롤에 액세스
- 12. 스레드를 생성하는 Java API
- 13. 포크 또는 스레드를 사용해야합니까?
- 14. 배경 스레드를 시작하는 방법?
- 15. 다른 스레드를 먹이는 스레드
- 16. NSOperation이 새 스레드를 생성합니까?
- 17. 누가 내 스레드를 방해합니까?
- 18. C# 스레드를 죽이는 방법?
- 19. 피보나치 스레드를 사용하여
- 20. NSURLConnection이 메인 스레드를 차단합니까?
- 21. Java에서 스레드를 수동으로 중지해야합니까?
- 22. 비동기 스레드를 처리하는 QNetworkAccessManager
- 23. 안전하게 COM 스레드를 동기화하십시오.
- 24. 스레드를 사용한 요청 처리
- 25. Windows에서 스레드를 예약하려면 어떻게해야합니까?
- 26. forkjoinpool에 스레드를 추가하는 방법
- 27. qx.io.remote.RPC가 다중 스레드를 지원합니까
- 28. 스레드를 통한 예외 전파?
- 29. wcf 스레드를 파기하십시오
- 30. 스레드를 사용해야 할 때
스레드 풀 스레드입니까, 아니면 명시 적으로 관리하고 있습니까? – drharris
당신은 어떻게 thrads를 만드나요? – Mehran
가능한 dup : http://stackoverflow.com/questions/6960520/when-to-dispose-cancellationtokensource/6961264#6961264 –