• ベストアンサー

スレッド処理内の変数の参照について

大変困ってます。 今、親プロセスからスレッド内の変数に設定したいのですが方法がわかりません。 スレッドからの場合、普通行えばいいのでわかるのですが ・・・。 (詳細) メインプロセス(A) クリエートスレッド後のスレッド(B)  1.(A)で(B)をCreateThread  2.(A)の本処理で(B)の構造体にmemcpyの方法が    わかりません。  3.知っている方がいましたら教えていただけませんか。  4.読みずらい文章ですみません。宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.2

なんとなく誤解があるような気がします。 実行ファイルを実行するとプロセスが作成され、さらに最初のスレッドが作成されます。ですから、この場合は、スレッド(A)とスレッド(B)ということになります。 そして、グローバル変数はプロセス固有のものなので、全てのスレッドから参照できます。mallocなどで取得したメモリも、アドレスさえわかっていれば、全てのスレッドから参照できます(Cのランタイムは同時に呼び出されてもいいように、マルチスレッド用のランタイムをリンクしないとダメです)。また、状況によっては、同期処理が必要になります。 スレッド(A)から、スレッド(B)が実行中の関数のローカル変数へ書き込みをするようなケースではないと思いますので省略します。 あえて、特定のグローバル変数を嫌うのであれば、SpiralGalaxyさんの言われているように、スレッド(A)がスレッド(B)を作成するときに、なんらかのワークのアドレスを渡すようにするか、TlsAlloc()などを使用して、全てのスレッドが共通のワークを参照できるようにする方法が適当だと思います。

その他の回答 (1)

回答No.1

aaa と bbb が同じ構造体だとして (A)の構造体 aaa を (b)の構造体 bbb にコピーするには… ということでいいんですね? CreateThread()の lpParameter に aaa のポインタをセットして呼び出してやって スレッド(B)でコピーしてやればいいです。 メインのスレッド { struct TEST aaa; CreateThread(…, (LPVOID)&aaa, …); … } DWORD WINAPI ThreadFunc(LPVOID pAAAA) { struct TEST* pTest = (struct TEST*)pAAAA; struct TEST bbb; memcpy(&bbb, pTest, sizeof(bbb)); ... } こんな感じでしょうか。

yoshio_n
質問者

お礼

さっそくの回答ありがとうございます。参考になりました。