1

他のチーム/製品で使用されるコンポーネントを作成しています。このコンポーネントにより、クライアント コードは一連のコマンドを発行でき、内部的にこれらのコマンドはワーカー スレッドで実行されます。コマンドが呼び出し元 (クライアント) スレッドのキューに追加され、削除/処理されるスレッド セーフ キューの実装を使用します。ワーカー スレッド。

「操作 XYZ が完了しました」という形式で、コンポーネントからクライアント コードにフィードバックを提供したいと考えています。コールバックを介して簡単にこれを行うことができますが、コールバックはワーカー スレッドで呼び出されます - 呼び出し元 (クライアント) スレッドで発生させたいのです。これどうやってするの?

クロス プラットフォーム コンポーネント (Windows、Linux、OS X) です。ブーストが利用可能です。私のデフォルトの開発コンパイラは MS VC++ 2010 です。つまり、C++11 ではありません。

4

3 に答える 3

2

このタイプのマルチスレッド アーキテクチャを調整する通常の方法は、各スレッドにファンクタのブロッキング キューを持たせることです。

各スレッドはそのキューをループし、各ファンクターを順番に実行します。

別のスレッドで関数を呼び出すには、ファンクタを作成してそのスレッド キューに追加するだけです。

C++ でファンクターを作成するにはstd::function、 and std::bind、lamdbas、関数オブジェクト、または関数ポインターを使用できます。見るstd::function

標準のブロッキング キューはありませんが、セマフォとミューテックス (std::threadライブラリの一部であり、pthread の一部でもある) を使用して作成するのはかなり簡単です。Google for"blocking queue"

于 2013-01-08T05:24:28.313 に答える
0

ワーカー スレッドからクライアントへの応答としてコマンドを送信するために設定したコマンド処理フレームワークを再利用してみませんか? フレームワークをより一般的なメッセージング フレームワークに変更する必要がありますが、おそらくその目的にはすでに適合しています。

コマンド オブジェクト/構造体には次が含まれている必要があります。

  • コマンドの ID (完了ステータスを返すために必要)
  • オプションで、発行者 ID (コマンドを送信したクライアント)。

    コマンド キューをワーカー スレッドからクライアントに戻すように設定する必要があります。クライアントごとに 1 つのキューが理想的ですが、コマンド オブジェクト/構造にクライアント ID が埋め込まれている場合は、その ID を使用して回答にタグを付けることができるため、クライアントがグローバル回答キューからメッセージをフィルタリングするのに役立ちます。また、アイドル時に応答キューをチェックし、応答を処理して UI の状態を更新する関数をクライアントに追加する必要があります。多くの UI フレームワーク (すべてではないにしても) がその可能性をサポートしているため、問題になることはありません。もう 1 つのオプションは、UI またはフレームワークがサポートしている場合、キューを UI イベント システムに接続することです。

1 ライター対 1 リーダー構成のロック フリー キュー アルゴリズムがあることに注意してください。これは、個々の応答キューにとって興味深いものになる可能性があります。

于 2013-01-08T12:33:40.530 に答える
0

を使用concurrent_queue<std::function<void()>>し、メインスレッドでこのキューをチェックして関数を確認します。

于 2013-01-08T13:13:16.683 に答える