Microsoft Visual C++ では、CreateThread() を呼び出して、1 つのvoid *
パラメーターで関数を開始することでスレッドを作成できます。私はそのパラメーターとして構造体へのポインターを渡します。他の多くの人も同様にそうしているのを見ます。
私の質問は、構造体にポインターを渡している場合、CreateThread() が呼び出される前に構造体のメンバーが実際にメモリに書き込まれたかどうかをどのように知ることができるかということです。それらがキャッシュされないという保証はありますか?例えば:
struct bigapple { string color; int count; } apple;
apple.count = 1;
apple.color = "red";
hThread = CreateThread( NULL, 0, myfunction, &apple, 0, NULL );
DWORD WINAPI myfunction( void *param )
{
struct bigapple *myapple = (struct bigapple *)param;
// how do I know that apple's struct was actually written to memory before CreateThread?
cout << "Apple count: " << myapple->count << endl;
}
今日の午後、本を読んでいるときに、この Web サイトやその他の Web サイトで、揮発性ではないデータをスレッドに渡す Windows コードがたくさん見られました。メモリ バリアなどはないようです。C ++または少なくとも古いリビジョンは「スレッド対応」ではないことを知っているので、他の理由があるのではないかと思っています。私の推測では、コンパイラは、CreateThread() への呼び出しでポインター &apple を渡したことを認識しているのでapple
、呼び出しの前にのメンバーを書き出すことを認識しています。
ありがとう