2012-01-03 7 views
2

나는 자동차 경주를 시뮬레이션해야하는 인터뷰 질문을 만났습니다.동시에 여러 실행 스레드에서 작업 시작

이 일반적으로 아무런 문제가 없었다, 내가 한 모든 차량이 목적지에 도달 내가 그것을 할 때까지 루프 를 내장 car.Race() 메서드를 호출입니다 (이것은 중요하지 않습니다!)

까다로운 무엇 자동차가 다른

Action<Car,ManualResetEvent> raceDel = (car,handel) =>{ 
     handel.WaitOne(); 
     car.Race(); 
    } 

    main() 
    { 
    ManualResetEvent [] handels = new ManualResetEvent[num_cars]; 
    Car [] cars = new Car[num_cars]; 
    for(int i = 0 ; i < num_cars ; i++) 
    { 
     handels[i] = new ManualResetEvent(false); 
     cars[i] = new Car(); 
     raceDel.BeginInvoke(cars[i],handels[i],null,null); 
    } 
     // the question lies here , i'm looking for something along the lines of 
     WaitHandel.SetAll(handels); // which no such method exists :) 

    } 

스레드 후 동시에하지 (차량 당 스레드) Car.Race을 (전화) 에 하나를 "경주"10 개 개의 스레드를 만들어 하나는 시작할 수와 차는 끝에 도달 할 것 스레드 5가 실행을 시작하기 전에 코스의

각 스레드에 manualresetevent를 보내고 waitOne()을 호출했습니다. 문제는 프레임 워크의 어떤 요소에서 ManualResetEvent의 전체 배열을 동시에 신호로 알릴 수 있었는지와 관련된 문제였습니다.

WaitHandle에는 MRE 배열 배열을 기다리는 WaitHandle.WaitAll (MRE_Array) 메서드가 있습니다. manualtetevent의 전체 배열에서 Set()을 호출하는 것과 같은 것을 찾을 수 있습니다.

어떤 아이디어가 있습니까?

트릭을 수행 할 수있는 작업 영역이나 다른 동기화 객체도 잘 수신 될 것입니다. 감사합니다. eran.

+0

누락 된 정보 : 제공 한 정확한 질문 및 코드 스 니펫 –

+0

내가 임의의 메서드를 호출하는 대리자에서 BeginInvoke를 호출하는 것을 본다고 생각하지 않는다. 하지만 도움이된다면 아쉽게도 그 주요 범위를 제공합니다. –

답변

5

ManualResetEvent 중 하나만 있으면됩니다.

모든 스레드에 전달하면 모두 동일한 이벤트를 기다릴 수 있습니다.

대기 핸들이 신호를 받으면 차단 된 모든 스레드가 계속 허용됩니다.

이것은 OS 스케줄러에 따라 다르게 실행된다는 것을 의미하지 않지만 실제로는 충분한 물리적 코어가 주어지면 실제로는 닫힐 것입니다.

+0

감사합니다. 수행 할 수 있는지 확실하지 않았습니다. –

+0

@eranotzer 환영합니다. –

관련 문제