現在、メモリバリア、ロック、およびメモリモデルの理解を深めようとしています。
私の知る限り、4 つの異なるタイプの緩和が存在します。名前は、書き込み -> 読み取り、書き込み -> 書き込み、読み取り -> 書き込み、読み取り -> 読み取りです。x86 プロセッサでは、Total Store Order (TSO) と呼ばれることが多い Write->Read 緩和のみが可能です。パーシャル ストア オーダー (PSO) ではさらに書き込み→書き込みの緩和が可能であり、緩和ストア オーダー (RSO) では上記のすべての緩和が可能です。
さらに、解放、取得、および両方の 3 種類のメモリ バリアが存在します。ロックは、バリアの取得と解放だけを使用することも、場合によっては完全なバリア (.Net) を使用することもできます。
次の例を考えてみましょう。
// thread 0
x = 1
flag = 1
//thread 1
while (flag != 1);
print x
私の現在の理解では、このコードを TSO マシンで実行する場合、追加のメモリ バリアは必要ないことがわかります。PSO マシンの場合、フラグ =1 の場合にスレッド 1 が x の実際の値を確実に取得できるように、x=1 とフラグ = 1 の間にリリース バリアが必要です。RSO マシンの場合は、while(flag != 1); の間にさらに取得バリアが必要です。x を出力して、スレッド 1 が x の値を早期に読み取らないようにします。
私の観察は正しいですか?