나는 자동차 경주를 시뮬레이션해야하는 인터뷰 질문을 만났습니다.동시에 여러 실행 스레드에서 작업 시작
이 일반적으로 아무런 문제가 없었다, 내가 한 모든 차량이 목적지에 도달 내가 그것을 할 때까지 루프 를 내장 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.
누락 된 정보 : 제공 한 정확한 질문 및 코드 스 니펫 –
내가 임의의 메서드를 호출하는 대리자에서 BeginInvoke를 호출하는 것을 본다고 생각하지 않는다. 하지만 도움이된다면 아쉽게도 그 주요 범위를 제공합니다. –