ソフトウェアとハードウェアのメモリ モデル、メモリ フェンス、ストア/ロードの再順序付けなどに関する情報はすでにたくさんあります。ただし、共有メモリに対する読み取りと書き込みの相対的な順序を保証することに焦点を当てているようです。
そのようなシステムがスレッドの書き込みを潜在的に長い時間遅らせることは合法的な振る舞いでしょうか?
たとえば、メモリ内のデータ構造を更新し、他のスレッドに更新を通知するフラグを立てるスレッドを考えてみましょう。
(dataWritten is initially false)
store value1
store value2
store value3
mfence
store dataWritten (true)
私が読んだほとんどのメモリ モデルによると、メモリ バリアは、古い値 1、2、または 3 を読み取っている間、他のスレッドが dataWritten を true として監視できないことを保証します。つまり、これらの書き込みをアトミックにします。
しかし、書き込みがまったく見られると確信できますか? フラグが値よりも早く書き込まれない限り、メモリ モデルの下で書き込みを無期限に遅らせることは合法でしょうか?
データベース用語では、メモリ モデルを使用して耐久性を判断できますか (上記の例のようにメモリ フェンスとフラグを使用して保証できるアトミック性と一貫性に加えて)。
更新: 可視性の適時性に関する volatile の詳細なセマンティクスは、Java メモリ モデルとメモリ モデルの順序と可視性のコンテキストで同じトピックを扱いますか? C++11 用。その議論はハードウェア メモリ モデルにも適用されますか。つまり、CPU ISA は正しい可視性シーケンスをハードに保証するだけで、遅延可視性を「ソフト」に保証しますか?