バックグラウンド
私はさまざまな本や記事を読んで、同時実行のコンテキストでのプロセッサキャッシュ、キャッシュの一貫性、およびメモリバリアについて学びました。しかし、これまでのところ、私の一般的なコーディング手法が厳密な意味で安全であるかどうかを判断することはできませんでした。
仮定
次の擬似コードは、2プロセッサマシンで実行されます。
int sharedVar = 0; myThread() { print(sharedVar); } main() { sharedVar = 1; spawnThread(myThread); sleep(-1); }
main()はプロセッサ1(P1)で実行され、myThread()はP2で実行されます。
最初、sharedVarはP1とP2の両方のキャッシュに存在し、初期値は0です(上記に示されていない「ウォームアップコード」のため)。
質問
厳密に言えば、できれば特定のタイプのCPUを想定せずに、myThread()は1を出力することが保証されていますか?
プロセッサキャッシュに関する私の新たな知識により、print()ステートメントの時点で、P2がmain()でのP1の割り当てによって引き起こされたsharedVarの無効化要求を受け取っていない可能性があります。したがって、myThread()が0を出力する可能性があるようです。
参考文献
これらは私が読んでいる関連記事と本です: