【发布时间】:2012-01-03 22:01:38
【问题描述】:
我遇到了一个面试问题,要求我模拟赛车。
这通常没有问题,我所做的只是调用我构建的 car.Race() 方法 循环直到汽车到达目的地(这并不重要!)
棘手的是让汽车“运行”的所有 10 个线程(每辆车线程)调用 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 :)
}
线程 1 可以启动,汽车将在线程 5 开始执行之前到达路线的终点。
我所做的是向每个线程发送一个手动重置事件并在其上调用 waitOne() 现在的问题是框架中的哪些元素可以同时发出整个 ManualResetEvent 数组的信号。
WaitHandle 有一个方法 WaitHandle.WaitAll(MRE_Array) 会等待一个 MRE 数组 要调用 send ,我正在寻找类似相反的东西,它会在整个 manualresetevent 数组上调用 Set() 。
有什么想法吗?
任何变通方法或其他同步对象都可以解决问题,也将受到好评 提前致谢 伊兰
【问题讨论】:
-
缺少信息:您提供的确切问题和代码 sn-p。
-
我不认为看到我在委托上调用 BeginInvoke 调用某个任意方法是问题的重点。但如果有帮助,我会为您提供它的主要范围
标签: c# multithreading synchronization