2011-09-06 3 views
1

다음 코드 조각이 있습니다 (C#) : 맞습니까?스레드를 시작하고 모두 끝내기를 기다리는 중

Thread[] threads = new Thread[totalThread]; 

for (int i=0; i<totalThread; i++) { 
    threads[i] = new Thread(new ThreadStart(Work)); 
} 

sw.Start(); 

for (int j=0; j<num_threads; j++) { 
    threads[j].Start(); 
} 


for (int k=0; k<num_threads; k++) { 
    threads[k].Join();  
} 

sw.Stop(); 

sw 스톱워치, work 일부 방법이다. 몇 가지 스레드를 사용하여이 메서드를 실행하고 싶습니다. 그러나 모든 것이 멈추는 것 같습니다 (조인하지 않는 것처럼 보입니다). 내 스레드 처리가 좋은지 또는 내가 망치고 있는지 알아야합니다. 후자의 경우 스레드 문제가 아닌 메서드 호출에 내 문제가 있음이 분명합니다. 감사.

+5

모두 괜찮아 보입니다. Work 메서드에 대한 코드를 게시 할 수 있습니까? – Chandu

+4

왜 첫 번째 루프에는'totalThread'를 사용하고 다음 루프에는 num_threads를 사용합니까? 그럼에도 불구하고 위의 코드가 잘되어야하므로 문제는 'Work'메소드에서 발생할 가능성이 높습니다. – dlev

+0

다시'DoSomething()'또는'DoSomethingElse()'가 어떤 것인지 모른 채 말하기는 어렵습니다. 'totalOperation'의 크기는 얼마나됩니까? 또한'op = r.Next (2)'라고 말할 수 있습니다. – dlev

답변

0

그것은 완벽합니다. num_threads/totalThread과 같은 문제는 전혀 표시되지 않습니다. totalThread이 큰 경우 (각 CPU 코어에 대해 1-2보다 큰 의미가있는 경우) ThreadPool을 사용해야합니다.

+0

나는 -1의 이유를 알고 싶습니다. 그냥 아는 것이 어떤 문제도 아닙니다. 내 대답은 정확했지만 제안은 정확합니다. 그래서? – xanatos

0

.Join 루프를 없애고 각 스레드에서 ManualResetEvent를 사용할 수 있습니다.

그러면 ManualResetEvents가 모두 신호가 날 때까지 기다릴 것입니다.

+2

그 이유가 확실하지 않습니다. 위의 코드는'Work()'메소드가 괜찮 으면 괜찮습니다. – dlev

+2

정확히 차이점은 무엇입니까? –

1

동결에 언급 했으므로 Work 메서드를 검토하고 교착 상태를 찾으십시오. 또한 Join 통화에 일부 시간 초과 메커니즘을 추가하십시오.

관련 문제