2010-03-06 2 views
1

A는 MSDN에 Managed Threading Best Practices 니펫 : 여기에 어떤 멀티 스레딩 패러다임이 설명되어 있습니까?

(예를 들어, 이벤트를 사용하여) 메인 프로그램에서 작업자 스레드의 실행을 제어하지 마십시오. 대신, 작업자 스레드가 작업이 가능할 때까지 대기하고, 실행하고, 완료 될 때 프로그램의 다른 부분에 알릴 책임이 있도록 프로그램을 설계하십시오. 작업자 스레드가 차단되지 않으면 스레드 풀 스레드 사용을 고려하십시오. Monitor .. ::. PulseAll은 작업자 스레드가 차단되는 상황에서 유용합니다.

기본 구현을 검색 할 수 있도록이 내용을 알고 싶습니다.

답변

2

은 무엇 니펫 의미하는 것입니다. 전용 스레드 (비 ThreadPool)가있는 경우 WaitHandle :: WaitOne 호출을 사용하여 처리 할 항목이있을 때까지 (대기열에있을 수 있음) 해당 스레드를 대기하게해야합니다. 제작자가 큐를 채우면 WaitHandle :: Set()을 호출하여 스레드 처리를 시작하도록 스레드에 알릴 수 있습니다. WaitOne()은 전용 스레드 용입니다. 대기열을 처리하려고 할 때마다 새 전용 스레드를 만드는 것이 비용이 많이 들기 때문입니다. 당신이 ThreadPool이 모든 응용 프로그램과 이용할 수있는 글로벌 리소스이기 때문에 다음 스레드 풀 스레드를 사용해서는 안) WaitOne을 (사용하려는 경우 풀 스레드를 차단하는 좋은 옵션이되지 않도록

DoProcessQueue() 
{ 
    while(RUNTHREAD) 
    { 
     ... process queue items 

     waitHandle.WaitOne(); // will wiat here until producer thread calls Set() 
    } 
} 

스레드 풀 스레드가 작은 작업에 권장 .

0

소리가 작업 풀과 비슷합니다.

여러 스레드가 작업 공유, 실행 및 공유 동기화 변수를 통해 프로그램의 다른 부분으로 보내는 공유 대기열에서 대기합니다.

기본 의미는 MVar 또는 기타 asynchronous channel의 의미입니다.

0

분산 된 "에이전트"기반 접근 방식처럼 들립니다.

멀티 스레드 코드를 작성하는 "전통적"방식은 직장에서 사용하는 마이크로 관리와 비슷합니다. 즉, 상사가 모든 작업을 손으로 처리하고 다른 모든 작업자는 예상대로 기다려야합니다. 팀 구성원간에 전달되어야하는 모든 작업은 보스를 통해 전달됩니다.

에이전트 기반 접근 방식은 필요에 따라 팀 구성원간에 작업을 찾아 내고 작업을 수행하도록 팀 구성원 모두에게 권한을 부여하는 것과 같습니다. 상사는 무슨 일이 일어나고 있는지 알고 있지만, 감독 모니터링 역할 만합니다.

당신이 소비자 스레드를 가지고있는 생산자 - 소비자 문제가 있다고 가정 :