0

私は開発の設計段階にあり、C++ でマルチスレッドを使用していくつかの機能を実装することを検討しています。私はマルチスレッドの基本に精通していますが、他の人に私のアイデアを引き継がせたいと思っていました。私はまだマルチスレッド ライブラリを選択していません (Boost に傾いています) が、私の質問はおそらく選択したライブラリとは無関係です。

基本的に、while ループで (終了するまで) 実行し、別のソフトウェアによって取り込まれたコマンドのメッセージ キューをチェックするクラス (CommandGenerator と呼びましょう) を用意します。CommandGenerator がキューからメッセージを取得するたびに、バックグラウンドで実行され、キューから取り出されたばかりのデータを処理するスレッドを生成したいと考えています。その間、CommandGenerator の実行を継続し、再び while ループを回避して、新しいメッセージを取得し、再びスレッドを生成したいと考えています。これは概念的に可能ですか?コードがループし続けてキューをチェックしている間、スレッドを生成し続け、完了するまでバックグラウンドで実行させることはできますか? CommandGenerator がスレッドを制御する必要はありません。

どんな入力でも大歓迎です。

4

3 に答える 3

2

あなたがやりたいことは、「生産者-消費者」パターンと呼ばれます。

受信したメッセージごとに新しいスレッドを作成しないことを強くお勧めします。一度に大量のメッセージを受信すると、マシンが詰まる可能性があります。

代わりに、メッセージ キューを読み取る一定数のコンシューマ スレッドを用意し、一度に 1 つのメッセージを処理できるようにします。一度に大量のメッセージが届くと、メッセージはキューに格納され、処理されるのを待ちます。

メッセージのフェッチと実際の処理の間に遅延があるため、解決策として、メッセージごとに 1 つのスレッドを生成するのではなく、コンシューマー スレッドの数を増やすだけです。このようにして、リソースの使用を管理下に置くことができます。正確に必要なスレッドの数は、アプリケーションに完全に依存するため、自分で見つける必要があります。

実装に関しては、C++11 を使用する場合は、std::thread / std::mutex と std::condition_variable だけが必要です。C++03 を使用する場合、boost には同等のクラスがあります。

于 2013-04-25T12:57:26.727 に答える
0

あなたのコンセプトは実現可能であり、通常のマルチスレッド パターンに非常に近いものです。1 つのパターンは、共有スレッド セーフ キューを使用することです。この場合は、CommandGenerator作業をキューにプッシュするプロデューサーがあります。次に、何かがキューに入れられるのを待っている消費者スレッドがあります。アイテムがキューにプッシュされると、スレッドの 1 つ (1 つだけ) がアイテムを取り出して処理できます。

これを実装する 1 つの方法は、 と を使用することstd::threadですstd::mutex

使用しているコンパイラによっては、std::asyncを真剣に検討する必要があります。これにより、どのスレッドがいつ作成されるかを知る必要があるという負担を取り除くことができます。

処理を停止する必要があるときに何が起こるかを確認する必要があります。たとえば、停止した場合、CommandGenerator処理中のスレッドが停止するのを待つ必要がありますか? コマンド処理スレッドはどのように停止されますか? まだキューにあるアイテムはどうなりますか? これらは、検討する必要がある設計上の決定事項です (まだ検討していない場合)。

于 2013-04-25T13:11:44.830 に答える
0

はい、あなたのコンセプトはかなり実現可能です。ただし、名目上、生成できるスレッドの数には上限があります。ただし、境界は大きくなる可能性があります。

于 2013-04-25T12:55:16.973 に答える