1

親愛なる C++ 専門家の皆様。問題が発生しました。1 つの抽象クラス base_class と 2 つの派生クラス (sippeers と dbget) を持つプログラムがあります。また、スレッドが 2 つあります。最初のスレッドはユーザーからコマンドを取得し、2 番目のスレッドはこれらのコマンドを処理します。どちらの派生クラスも異なるコマンドを表します。そのため、ある種のスタックを作成する必要があります。最初のスレッドからユーザー コマンドを配置し、2 番目のスレッドでそれらを取得して処理する必要があります。すべてのコマンドに対して 1 つのスタックを作成するには、ポリモーフィズムを使用する必要があります。まず、std::list を使用してみました。しかし、最初の問題がありました。抽象クラスのリストを作成できません。次に、boost::ptr_list を使用しようとしましたが、2 番目の問題がありました。最初のスレッドで作成されたクラスが、それらを作成したプロシージャの最後で消えてしまいます。したがって、ポインタは違法になります。質問:どのような認識を使用する必要がありますか? 派生クラスのすべてのコピーを保存する必要があるようです。しかしここで?

4

2 に答える 2

1

std :: queue ofshared_ptr<base_class>は、メモリ管理について心配することなく、あるスレッドから別のスレッドにクラスを渡すための最も簡単なソリューションです。条件変数と組み合わせて、キューが空ではないことを通知し、コンシューマースレッドが待機できるようにします。

ポリモーフィズムの部分には、追加の仮想関数(execute()?)を用意します。これにより、コンシューマースレッドは、実際に受け取るクラスを認識しないようにする必要があります。

于 2011-04-12T08:38:13.983 に答える
1

まず、std::list を使用してみました。しかし、最初の問題がありました。抽象クラスのリストを作成できません。

ただし、抽象基本クラスへのポインターstd::listを含むを作成することはできます。

std::list<base_class *> commands;

次に、boost::ptr_list を使用しようとしましたが、2 番目の問題がありました。最初のスレッドで作成されたクラスが、それらを作成したプロシージャの最後で消えてしまいます。したがって、ポインタは違法になります。

新しいコマンドは最初のスレッドのスタックに作成されるということですか? そうしないでください。最初のスレッドは、2 番目のスレッドがいつコマンドの処理を終了したかを認識していません。を使用して最初のスレッドにオブジェクトを割り当てるだけですnew

そうは言っても、あなたのユースケースは、生産者と消費者の問題の古典的な例のように聞こえます。このようなシステムを適切に実装する方法については、ウィキペディアのページを参照してください (間違いを犯すことはそれほど難しくありません)。

于 2011-04-12T08:44:54.223 に答える