3

いくつかの並行コードでは、回路のように多数の信号を接続したいと考えています。.NET では、シグナルのコレクションに対して WaitAll または WaitAny を実行できます。私はこのようなことをしたい:

WaitAny ( WaitAll (c1, c2), WaitAll (c3, c4) ) ;

残念ながら、ライブラリはこれらの操作をより複雑なツリーに構成することをサポートしていません。私の質問は (1) .NET でこれを行う方法はありますか? (2) このための洗練されたライブラリはどの言語にもありますか?

[編集: コーリーが詳細を尋ねた]

メッセージパッシングライブラリを構築したい。10K の小さな同時キューが存在する可能性があり、メッセージを含むものもあります。キューからメッセージを取得し、キューに割り当てられたハンドラーを実行したいと考えています。ただし、ハンドラーが完了するまで次のメッセージを取得することはできません (キューごとにシングル スレッド)。したがって、次の項目をポップして実行する前に、キュー (メッセージを受け取った?) とコード (前のメッセージで終了した?) の両方を待ちたいと思います。

4

3 に答える 3

1

私は問題を誤解しているかもしれません。しかし、リアクティブ フレームワーク (Rx) はあなたが探しているものでしょうか。探している方法で構成可能なイベントを許可する必要があります。

http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

于 2010-03-12T16:07:16.003 に答える
1

私がこれを提案しているとは信じられませんが、他のスレッドがWaitAll呼び出しを実行し、WaitAny でリッスンする個別のシグナル (WaitAll のグループごとに 1 つ) をトリガーすることができます。本当に悪臭がして、シンプルであるべきものが複雑すぎるように思えます。クリックしたことを後悔するかもしれませんPost Your Answer;-)

ManualResetEvent _Group1Event = new ManualReset(false);
ManualResetEvent _Group2Event = new ManualReset(false);

void SomeThread()
{
    ...
    WaitHandle.WaitAny(_Group1Event, _Group2Event);
    ...
}

void Group1WatcherThread()
{
    ...
    if (WaitHandle.WaitAll(c1, c2))
    {
       _Group1Event.Set();
    }
    ...
}

void Group2WatcherThread()
{
    ...
    if (WaitHandle.WaitAll(c3, c4))
    {
       _Group2Event.Set();
    }
    ...
}

私のWaitAll/WaitAnyメソッド呼び出しについてはわかりませんが、この例は、完全な解決策を提供しないアイデアを示すことを目的としていました.

于 2010-03-02T00:15:31.310 に答える
-1

これが .NET でもどの言語でもサポートされているとは思えません。低レベルのプリミティブで難しい方法で行う必要があります。

于 2010-03-12T15:41:28.617 に答える