【问题标题】:simultaneously begin operations on several execution threads同时在多个执行线程上开始操作
【发布时间】: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


【解决方案1】:

你只需要一个ManualResetEvent

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

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

这并不意味着它们都会同时继续执行 - 这取决于操作系统调度程序 - 但实际上它会很接近,只要有足够的物理内核。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多