2012-01-03 21 views
2

私は自動車レースをシミュレートするために必要なインタビューの質問に出くわしました。は複数の実行スレッドで同時に操作を開始します

これは、一般的には問題はなかった、私がしたすべては車が目的地に到達した私は、それまでループし を建てcar.Race()メソッドを呼び出している(これは重要ではありません!)

トリッキーだったもの車は(車1台スレッド)の「レース」全10件のスレッドが同時にではなく1が起動でき、車が最後に到達するだろう他の

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をCar.Race() を呼び出すようにすることですスレッド5がその実行を開始する前のコースの

各スレッドにmanualreseteventを送り、waitOne()を呼び出しました 問題はフレームワーク内のどの要素でManualResetEventの配列全体を同時に通知することができるのかという問題でした。

WaitHandleには、MREの配列を待機するWaitHandle.WaitAll(MRE_Array)があります。 はsendを呼び出すために、私はmanualreseteventの配列全体でSet()を呼び出す逆のようなものを探しています。

トリックを行う可能性のある回避策やその他の同期オブジェクトもよく受信されます。 ありがとうございました eran。

+0

情報がありません:あなたが提供した正確な質問とコードスニペット。 –

+0

私はBeginInvokeをいくつかの任意のメソッドを呼び出すデリゲートで呼び出すのを見ているとは思わない。 しかし、それが助けがある場合、病気はそれの主要な範囲を提供します –

答えて

5

ManualResetEventの1つが必要です。

すべてのスレッドに渡すと、すべて同じイベントを待つことができます。

待機ハンドルが通知されると、ブロックされたスレッドはすべて続行できます。

これはOSスケジューラまですべてが同時に実行されることを意味するわけではありませんが、実際には十分な物理コアが与えられていれば、実際には近いでしょう。

+0

おかげで私はそれを行うことができるか分からなかった。 –

+0

@eranotzerよろしくお願いします。 –

関連する問題