同时在多个执行线程上开始操作

本文关键字:线程 开始 操作 执行 | 更新日期: 2023-09-27 18:19:16

我遇到了一个面试问题,要求我模拟一场汽车比赛。

这在一般情况下没有问题,我所做的只是调用我构建的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开始执行之前,汽车将到达路线的终点。

我所做的是发送一个manualreseevent到每个线程并调用waitOne()现在的问题是,框架中的什么元素可以同时向整个ManualResetEvent数组发出信号。

WaitHandle有一个方法WaitHandle. waitall (MRE_Array)来等待一个MRE数组要调用send,我正在寻找类似于相反的东西,它将在整个manualresetevent数组上调用Set()。

有什么想法吗?

任何可能完成此任务的变通方法或其他同步对象也会很受欢迎提前感谢伊兰。

同时在多个执行线程上开始操作

你只需要一个ManualResetEvent

传递给所有的线程,它们都可以等待同一个事件。

当等待句柄发出信号时,所有被阻塞的线程都被允许继续。

这并不意味着它们都将继续并发执行——这取决于操作系统调度程序——但在实践中,如果有足够的物理内核,它将接近。