- ベストアンサー
マルチスレッド間でデータ交換をする方法
マルチスレッドの知識がないままに、プログラミングをする必要が出てしまったのですが、書籍などで調べても分からない部分があるため、質問いたします。 Win32APIを用いて(MFCは使用しない)、WindowsでVC7.0環境です。 やりたいことは、 スレッドAとスレッドBを生成し、 スレッドAの終了時点で、スレッドBがスレッドA内部で生成したクラスのインスタンスを取得するというものです。(もしくはその逆) スレッドAとB自体もクラスで構成しており、内部で生成されるインスタンスはグローバルではないため、スレッドBからスレッドAを見えるような仕組みが必要なのでしょうか?? まだイメージだけの段階で、ソースコードで表現できなくて申し訳ないのですが、簡単にご教授くださる方、もしくは参考になるサイトを教えてくださる方がいらっしゃいましたら、お願いいたします!
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
スレッド間でデータ(メモリ空間)は共有されます。 なので, どのスレッドからも,同じようにデータにアクセスできます。 goopon さんの質問内容は,スレッド間というよりも,クラスのインスタンス間でのデータ交換になると思います。 クラス Y のインスタンス y で生成したデータを, クラス X のインスタンス x で使いたければ, 例えば,x の生成時に y へのポインタを渡しておいて,それを使って,y のメンバ関数を呼び出したりしますよね? これは,マルチスレッドでも,シングルスレッドでも同じことです。 ただし,気をつけないといけないのは, スレッド A から y のメンバ関数を呼び出すと,スレッド A で処理が行われ, スレッド B から y のメンバ関数を呼び出すと,スレッド B で処理が行われるということです。 つまり,A と B から同時に y のメンバ変数を書き換えたり, A が読んでいる最中に B が書き込んだりといったことが起こり得ます。 こうなると,データの整合性が取れなくなる恐れがあるので, スレッド間の同期を取ったり(排他制御をしたり)する必要があります。
その他の回答 (4)
- yasuch
- ベストアンサー率41% (27/65)
Singletonパターンの非常に簡単な例が参考URLに載っていますよ。
補足
回答ありがとうございます。 見やすくすごく参考になります。
- skyrandom
- ベストアンサー率0% (0/15)
#2です。やっていることは#1様と同じです。ただ、こういうのっていろんな人がやっているので先人がパターンとして残してあるよ,あるから(1から実装せずに)そのままコピーしたらどうですか?と言っています。
お礼
回答ありがとうございます。 参考にさせていただきます。
- skyrandom
- ベストアンサー率0% (0/15)
singletonパターンはご存知でしょうか?上記のことはsingletonパターンを使って実現できます。
補足
知っていますが、どのように実現できるのか、具体的なイメージが全然浮かびませんm(__)m これでは知っているとも言えないかも・・・。 できればイメージできるようなアドバイス頂ければ助かります!!
- tukai
- ベストアンサー率14% (2/14)
実現できるかどうかは分かりませんが、まずスレッド間でデータを交換する為のグローバル変数(後々使う事を考えて配列にした方がいいかも)を用意し、staticでそのクラスのインスタンスを確保するようにして(staticにしないとスレッドから抜けた時点で、データが開放されてしまう)そして、さっきのスレッド間でデータを交換する為のグローバル変数に、そのスレッドBに渡したいインスタンスのアドレスを入れてみてはいかがでしょうか。 ちなみにこれは実際にやっていないので成功するかどうかは分かりません
補足
早速の回答ありがとうございます! グローバル変数を使用するなら、なんとなくイメージできます。この方法が一般的なんでしょうかね?? できればグローバル変数を使用せずに済ませたいのですが・・・。
お礼
回答ありがとうございます。 >スレッド間の同期を取ったり(排他制御をしたり)する必要があります。 これが肝ですね。この辺の知識もない状態なので、勉強しながら試していきたいと思います。