2011-02-18 5 views
0

実行時にスレッドが待機するEventWaitHandleを安全に変更する方法を知りたいと思います。実行時に、スレッドが待機するWaitHandleを代入する方法

例えば、EventWaitHandlesによって同期される2つのスレッド(AとC)があるとします。 Aはそのジョブを周期的に実行し、CはAからジョブを開始できるという通知を(たとえばAutoResetEventによって)受け取るまで待ちます。パターンはACACです...

この後、新しいスレッド(B)が起動され(たとえば、ユーザーアクションによって)、そのジョブはこのように2つの既存のスレッドの間で実行されます。 BとBが信号を終了すると、CはCを終了します。パターンはABCABC ...

スレッドCがAと共有していたEventWaitHandleを待っていた後、別のEventWaitHandleを共有する別のEventWaitHandleを待機させる安全なメカニズムが必要です。 B.これが完了すると、EventWaitHandleを使用してAジョブを待機し、EventWaitHandleを使用してCジョブを通知するBを簡単に起動する必要があるため、Cが使用するEventWaitHandleをトリッキーな部分に置き換えているようです。このメカニズムでは、スレッドBを安全にアンマウントし、スレッドAとCのみが動作している初期の状態に戻る方法も提供する必要があります。

EventWaitHandleでこれを達成する安全な方法はありますか?そうでない場合は、他の提案もありがとうございます。

+0

.NET 4.0を使用している場合は、[タスク]を使用すると簡単になります。本質的には、AとBがBで続き、CがBで続けるというような3つのタスクがあります。Bは本質的に何もしないという状況では何もしませんが、あるときは何かをするでしょう。ミックスからBを「挿入」して「取り除く」のではなく、常にミックスしておく必要があります。これにより、これを維持するのが難しくなりません。 –

答えて

0

タスクAが変更を認識している場合、タスクCはそのイベントを所有します。タスクAは、Cが次の場合はタスクCのイベントを通知し、次のタスクBの場合はタスクBのイベントを通知します。

また、他の共有データを変更するのと同じメカニズムを使用します。ハンドルへのすべてのアクセスでmutexを取得します。例えばタスクCは、ロックを獲得し、ハンドルを読み取り、ロックを解除し、ハンドルを待つ。それを変更するには、UIスレッドがロックを取得し、ハンドルを変更し、ロックを解除します。

+0

ありがとう私はあなたの第二の選択肢を試して、それは働いた。しかし、ハンドルを変更する前に、ロックを取得する前に、デッドロックを避けるために前のハンドルを通知しなければなりません –

0

あなたは、スレッドが開始して完了を通知するためのハンドルを登録(登録解除)できる何らかのスケジューラの実装について考えましたか?そして、スケジューラは、適切な開始イベントを設定することによって次のスレッドを開始し、前のスレッドが完了イベントを設定したときに次のスレッドを続行する。

+0

私は後で試してみることができるエレガントな解決策のようです、ありがとう! –

関連する問題