0

私はC#プログラミングをかなり言語に合わせて調べています。オブジェクト指向プログラミング全般と、複数のスレッドを実行することの意味を大まかに理解していると思いますが、実際の実装はスクラブと同じです。

私が探しているのは、多くのスレッドが独立して実行され、相互作用するツールを作成することです。各スレッドは独自のタスクを実行し、他のスレッドを呼び出すことができます。

(異なるスレッドから同時に発生する複数の更新で何も失わずに)通信を確保するための私の戦略は、外部と呼ぶことができるタスクのようなスプールを作成し、特定のスレッドにタスクを追加するか、これらのサービスをスプールすることです。これをクラスに配置するか外部に配置して、クラス自体に新しいタスクのためにスプールを呼び出しさせ、スプールを追跡させるべきかがわかりません。ここでは特に、空のスプールがタスクを取得した場合にクラスに通知する方法を検討しています(リスナーのアプローチなので、新しいものが到着した場合にタスクを目覚めさせたい場合は、タスクがプールにサブスクライブできます)。タスクの数と次のタスクはスケジュールされていません」アプローチ

これを作成するための良い戦略は何でしょうか。実際のクラスで作成する必要がありますか、それとも外部で作成する必要がありますか?「ビジーウェイトチェック」では、新しいジョブの追加と実際のスプールでのジョブの削除のみが可能であり、シグナリングではジョブの追加と削除の両方が必要になるだけでなく、スリープ状態になるため、実装の重要な領域は何ですか。シグナリングがクリティカルになると、クリティカル領域に入った場合にどうするかというスプールの要件が突然高くなります。これにより、ブロックが発生し、他のブロックが発生し、予期しないデッドロックが発生する可能性があります。

4

1 に答える 1

1

私はこのようなモデルをさまざまなシステムで頻繁に使用しています。エージェント用のクラス、たとえば「AgentClass」とリクエスト用のクラス、たとえば「RequestClass」を定義します。エージェントには、「submit(RequestClass * message)」と「signal()」の2つの抽象メソッドがあります。通常、エージェント内のスレッドはプロデューサー/コンシューマーキューを構築し、RequestClassインスタンスを待機します。submit()メソッドは、渡されたRequestClassインスタンスをキューにキューイングします。RequestClassには通常、リクエストの実行に必要なすべてのデータと「送信者」エージェントインスタンスとともに、エージェントに何をする必要があるかを伝える「コマンド」列挙が含まれています。エージェントがリクエストを受け取ると、列挙をオンにして、リクエストを実行するための正しい関数を呼び出します。エージェントは、RequestClassのデータ(結果、エラーメッセージなど)にのみ作用します。RequestClassのデータメンバーに配置されます。エージェントがリクエストを実行したとき(または失敗してエラーデータを生成したとき)、リクエストを送信者に送信(つまり、リクエストが非同期で実行された)するか、送信者のsignal()関数を呼び出すことができます。 whchは、送信者が待機していたイベントを通知します(つまり、要求は同期的に実行されました)。

私は通常、起動時に固定数のRequestClassインスタンスを作成し、それらをグローバルな「プール」PCキューに格納します。リクエストを送信するために必要なエージェント/スレッド/その他のものは、RequestClassインスタンスをデキューし、データを入力し、それをエージェントにsubmit()して、リクエストが実行されるのを非同期または同期で待機できます。完了すると、RequestClassがプールに返されます。これは、継続的なmalloc / free / new / disposeを回避し、デバッグを容易にするために行い(タイマーを使用してプールレベルをステータスバーにダンプするため、リクエストがリークしたり、ダブルフリーになったりした場合は常に通知します)、アプリのクローズ時に明示的なスレッド終了の必要性(複数のスレッドがアプリケーションフォームなどよりも長持ちするデータ領域に対してのみ読み取り/書き込みを行う場合)

このようなメッセージパッシング設計は、ロック(存在する場合)のみがPCキューにあるため、デッドロックに対して非常に耐性がありますが、十分に努力すれば確実に達成できます:)

これはあなたが必要としていると思われる種類のシステムですか、それとも私はそれを間違えましたか?

Rgds、マーティン

于 2011-09-12T12:29:22.313 に答える