私はのようなコードを持っていると仮定します。私は今Foo f;
ような何かを、別のスレッドにオーバーf
へのポインタを渡した場合C++コンストラクタメモリ同期
void InitializeComplexClass(ComplexClass* c);
class Foo {
public:
Foo() {
i = 0;
InitializeComplexClass(&c);
}
private:
ComplexClass c;
int i;
};
、私はどんな店がInitializeComplexClass()
によって行われていること何の保証を持っていますf
にアクセスする他のスレッドを実行しているCPUに表示されますか? i
にゼロを書き込んだ店舗はどうですか?クラスにミューテックスを追加し、コンストラクタでライターロックを取得し、メンバーにアクセスするすべてのメソッドで対応するリーダーロックを取得する必要がありますか?
更新:コンストラクタが返されたら、他のスレッドの束にポインタを渡すとします。私は、コードがx86上で動作していると仮定していませんが、メモリの並べ替えを自由に行うことができるPowerPCのようなもので動くことができます。私は本質的に、コンストラクタが復帰したときに、コンパイラがコードにどのようなメモリ障壁を注入しなければならないかということに興味があります。
本当にスレッド間でどのように共有しているかによって異なります。 – NathanOliver
'Foo'が一度初期化され、複数のスレッドで読み込まれる場合、' const'ポインタを他のスレッドに渡すことをお勧めします。 C++は実際には深いまたは推移的な 'const'を持っていませんが、もしあなたが他のスレッドがメンバを変更することができないならば、ロックなしで逃げるでしょう。 –
そして、可視性が整理されたら、あなた自身をまだ保護していなければ、 'ComplexClass'の非原子的な変化に注意してください。 – user4581301