アプリ版:「スタンプのみでお礼する」機能のリリースについて

マルチスレッドの知識がないままに、プログラミングをする必要が出てしまったのですが、書籍などで調べても分からない部分があるため、質問いたします。

Win32APIを用いて(MFCは使用しない)、WindowsでVC7.0環境です。

やりたいことは、
スレッドAとスレッドBを生成し、
スレッドAの終了時点で、スレッドBがスレッドA内部で生成したクラスのインスタンスを取得するというものです。(もしくはその逆)

スレッドAとB自体もクラスで構成しており、内部で生成されるインスタンスはグローバルではないため、スレッドBからスレッドAを見えるような仕組みが必要なのでしょうか??

まだイメージだけの段階で、ソースコードで表現できなくて申し訳ないのですが、簡単にご教授くださる方、もしくは参考になるサイトを教えてくださる方がいらっしゃいましたら、お願いいたします!

A 回答 (5件)

スレッド間でデータ(メモリ空間)は共有されます。



なので,
どのスレッドからも,同じようにデータにアクセスできます。

goopon さんの質問内容は,スレッド間というよりも,クラスのインスタンス間でのデータ交換になると思います。

クラス Y のインスタンス y で生成したデータを,
クラス X のインスタンス x で使いたければ,
例えば,x の生成時に y へのポインタを渡しておいて,それを使って,y のメンバ関数を呼び出したりしますよね?

これは,マルチスレッドでも,シングルスレッドでも同じことです。

ただし,気をつけないといけないのは,
スレッド A から y のメンバ関数を呼び出すと,スレッド A で処理が行われ,
スレッド B から y のメンバ関数を呼び出すと,スレッド B で処理が行われるということです。
つまり,A と B から同時に y のメンバ変数を書き換えたり,
A が読んでいる最中に B が書き込んだりといったことが起こり得ます。
こうなると,データの整合性が取れなくなる恐れがあるので,
スレッド間の同期を取ったり(排他制御をしたり)する必要があります。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
>スレッド間の同期を取ったり(排他制御をしたり)する必要があります。
これが肝ですね。この辺の知識もない状態なので、勉強しながら試していきたいと思います。

お礼日時:2006/01/23 23:06

Singletonパターンの非常に簡単な例が参考URLに載っていますよ。



参考URL:http://www.01-tec.com/document/cpp_design_patter …

この回答への補足

回答ありがとうございます。
見やすくすごく参考になります。

補足日時:2006/01/23 23:07
    • good
    • 0

#2です。

やっていることは#1様と同じです。ただ、こういうのっていろんな人がやっているので先人がパターンとして残してあるよ,あるから(1から実装せずに)そのままコピーしたらどうですか?と言っています。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考にさせていただきます。

お礼日時:2006/01/23 23:08

singletonパターンはご存知でしょうか?上記のことはsingletonパターンを使って実現できます。

この回答への補足

知っていますが、どのように実現できるのか、具体的なイメージが全然浮かびませんm(__)m
これでは知っているとも言えないかも・・・。

できればイメージできるようなアドバイス頂ければ助かります!!

補足日時:2006/01/19 23:36
    • good
    • 0

実現できるかどうかは分かりませんが、まずスレッド間でデータを交換する為のグローバル変数(後々使う事を考えて配列にした方がいいかも)を用意し、staticでそのクラスのインスタンスを確保するようにして(staticにしないとスレッドから抜けた時点で、データが開放されてしまう)そして、さっきのスレッド間でデータを交換する為のグローバル変数に、そのスレッドBに渡したいインスタンスのアドレスを入れてみてはいかがでしょうか。



ちなみにこれは実際にやっていないので成功するかどうかは分かりません

この回答への補足

早速の回答ありがとうございます!
グローバル変数を使用するなら、なんとなくイメージできます。この方法が一般的なんでしょうかね??

できればグローバル変数を使用せずに済ませたいのですが・・・。

補足日時:2006/01/19 23:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています