0

「エージェント」クラスを持つC#プログラムがあります。このプログラムは複数のエージェントを作成し、各エージェントには「run()」メソッドがあり、タスクを実行します (つまり、Task.Factory.StartNew() ...)。
各エージェントはいくつかの計算を実行し、次の段階に進む前に、他のすべてのエージェントが計算を完了するのを待つ必要があります (彼のアクションは、他のエージェントの計算に基づいています)。
Agent を待機させるために、CancellationTokenSource (「tokenSource」という名前) を作成し、この Agent がスリープ状態になることをプログラムに警告するために、イベントをスローしました。したがって、2 つの連続するコマンドは次のとおりです。

(1) OnWaitingForAgents(new EventArgs());
(2) tokenSource.Token.WaitHandle.WaitOne();

(イベントは、それ自体がスレッドである「AgentManager」クラスによってキャッチされます。2 番目のコマンドは、キャンセル トークンのシグナルが受信されるまで、エージェント タスク スレッドをスリープ状態にします)。

上記のイベントが発生するたびに、AgentManager クラスがそれをキャッチし、カウンターに +1 を追加します。カウンターの数がプログラムで使用されるエージェントの数と等しい場合、AgentManager (すべてのエージェントへの参照を保持する) は、次のように各エージェントを起動します。

agent.TokenSource.Cancel();

ここで私の問題に到達します。最初のコマンドはエージェントによって非同期的に実行され、スレッド間のコンテキストの切り替えにより、AgentManager がイベントをキャッチしたように見え、すべてのエージェントを起動します。しかし - 現在のエージェントはまだ 2 番目のコマンドに到達していません。このように、エージェントは「起床」信号を受信し、それから初めて眠りにつくことになります。2 つの連続するメソッドをまとめて「原子化」する方法はありますか? そのため、コンテキストの切り替えは発生せず、AgentManager が彼を起こす前にエージェントを強制的にスリープ状態にしますか?

4

3 に答える 3

1

あなたが求めている低レベルの手法は、スレッド同期です。そこにあるのはクリティカル セクション (またはその一部) であり、アクセスを保護する必要があります。スレッドの同期とクリティカル セクションについてまだ学んでいないのに、マルチスレッド プログラミングについて学んだとは驚きです。あらゆる種類の「低レベル」マルチスレッド プログラミングでは、これらのことについて知っておくことが不可欠です。

于 2011-04-12T12:12:30.317 に答える
0

うーん...Windowsも.NETもリアルタイムではないので、.NETでコンテキストスイッチを心配してソフトウェアを開発するのは良い考えではありません(または可能でさえありません)。おそらく、そのコードには別の種類の問題があります。

単純にすべてのエージェントを並行して実行していて、すべてのエージェントが終了するまで待ってから次の段階に進む必要があることは理解しています。これを実現するためにいくつかの手法を使用できますが、最も簡単なのは と を使用することMonitor.Wait(Object monitor)ですMonitor.PulseAll(Object monitor)

タスク ライブラリには、それを行うためのいくつかの機能もあります。@jishi が指摘したように、Parallelフレーバーを使用するか、多くの s を生成してからメソッドTaskですべてを待つことができます。Task.WaitAll(Task[] tasks)

上記のイベントが発生するたびに、AgentManager クラスがそれをキャッチし、カウンターに +1 を追加します。

どのようにそのカウンターに 1 を追加し、どのように読み取っていますか? アトミック操作を確実にするために使用し、たとえばInterloked.Increment揮発性操作で読み取るか、単にロックステートメントに入れる必要があります。Thread.VolatileRead

于 2011-04-12T10:15:45.277 に答える
0

おそらく、.NET 4 の Parallel.Invoke または Parallel.For を調べてください。これにより、メソッドを並列で実行し、すべての並列メソッドが呼び出されるまで待機できます。

http://msdn.microsoft.com/en-us/library/dd992634.aspx

それはあなたを大いに助け、すべての待ち行列を処理してくれるようです.

于 2011-04-09T11:47:24.723 に答える