次の C++ オブジェクトを定義するとします。
class AClass
{
public:
AClass() : foo(0) {}
uint32_t getFoo() { return foo; }
void changeFoo() { foo = 5; }
private:
uint32_t foo;
} aObject;
オブジェクトは、T1 と T2 の 2 つのスレッドによって共有されます。T1 は常にgetFoo()
ループ内で呼び出して番号を取得しています (changeFoo()
以前に呼び出されていない場合は常に 0 になります)。ある時点で、T2 がchangeFoo()
それを変更するために呼び出します (スレッド同期なし)。
T1 がこれまでに取得した値が、最新のコンピューター アーキテクチャとコンパイラで 0 または 5 と異なる可能性はありますか? これまでに調査したすべてのアセンブラー コードは、32 ビット メモリの読み取りと書き込みを使用していました。これにより、操作の整合性が保たれているようです。
他のプリミティブ型はどうですか?
実用的とは、理論的にこれ (または別のコードで同様の状況) が可能である既存のアーキテクチャまたは標準準拠のコンパイラの例を示すことができることを意味します。私は現代という言葉を少し主観的に残しています。
編集:多くの人が、5 が読まれることを期待すべきではないことに気付いているのを見ることができます。それは私にとって完全に問題なく、私はそうするとは言いませんでした(ただし、この側面を指摘してくれてありがとう)。私の質問は、上記のコードでどのようなデータ整合性違反が発生する可能性があるかということでした。