2012-03-06 20 views
0

私は別のスレッド(IOスレッド)からの情報を必要とするGUIスレッドを持っています。 IOスレッドはすべてシリアルポートから情報を取得しています。 Guiスレッドはすべて、フェッチ情報を読み込んでテーブルに表示しています。C++でスレッドを共有するスレッド

多分、IOスレッドはmutexによって保護されているグローバルな構造体にデータを入れ、GUIスレッドはその構造体から読み込むべきです。より良い実装がありますか? この場合、ミューテックスよりもクリティカルセクションの方が優れていますか?

私は、なぜIOスレッドもGUIスレッドだけを使っていないのですが、マルチスレッドを必要としないという返事が出てくることは知っています。はい、私はベストプラクティスを学ぶための簡単な例を挙げようとしています。

ありがとう!

答えて

1

私が示唆しているのは、同じ構造体の2つの異なるインスタンスです。あなたのIOスレッドは、GUIスレッドが更新される準備ができたら、mutexをつかみ、それをGUIスレッドの構造体にコピーし、mutexのロックを解除し、構造体の更新されたコピーを読むべきであることをGUIスレッドに通知します。

クリティカルセクションでは、一度に1つしか実行できないコードセクションを持つという概念を指しています。主に、矛盾した状態になる可能性があるためです。クリティカルセクションを作成する方法は、ロックミューテックスとロックアウトミューテックスを使用してそれをゲートすることです。

+0

こんにちは、それぞれの1つはグローバルなものを共有する構造体を持っていますが、いずれにしてもミューテックスを使用すると言いますか? 重要なセクションについては、ミューテックスは常にミューテックスであると考えていたので、実際にはミューテックスのようなOSからクリティカルセクションと呼ばれるものがあると思ったので、アプリケーション全体を共有します – Kam

+0

ああ、私はその構造体に書き込むことはしませんので、mutexは必要ありません。 – Kam

+0

まあ、(GUIスレッド構造体にローカルなIOスレッドからの)コピーを作成するときにはまだミューテックスが必要ですが、GUIスレッドがmutexを必要としないので、常に一貫した状態になります。 通知後10秒が経過しても、構造体の更新が安全でない可能性がある場合でも、GUIの読み取りの可否を決めることはできません。そのため、ミューテックスを入れてみてください。しかし、その小さな時間のほかに、GUIスレッドが読むための公正なゲームです。 –

2

これを行う1つの方法は、IOスレッドが入力データをGUIにポストさせることです。 IOスレッド上でデータを受け取るたびに、ヒープ上の構造体にパッケージ化し、構造体のアドレスとともにカスタムメッセージをGUIスレッドにポストします。 IOWでは、GUIスレッドを作成し、次にIOスレッドがGUIスレッドのハンドルをIOスレッドに渡して、データをGUIに送り返すために使用します。そうすれば、ミューテックス/クリティカルセクションを気にする必要はありませんが、既存のGUIメッセージキューを使用するか、プロジェクトが実行される環境に応じて自分自身を作成することができます。

+0

+1通常のGUIスレッド上のメッセージを使ってバッファインスタンス/入力キュー。 –

関連する問題