以下のコードでCPUがunsafe_variableを2回フェッチできるかどうかを確認したいのですが?揮発性および_ReadWriteBarrier(VS上)のために、コンパイラーがコードを並べ替えたり最適化したりしないと仮定しましょう。ここではMutexを使用できません。私は、潜在的なダブルフェッチの場合のみを気にします。
私はCPU設計の専門家ではありませんが、潜在的なダブルフェッチに関して懸念しているのは、投機的実行(分岐予測とプリフェッチ手法を含むパフォーマンス最適化手法)、レジスタとメモリ位置の名前変更、およびリオーダーバッファの使用です。 1つまたは2つのCPU内にバッファを保存しますか?ここでのダブルフェッチが可能かどうか教えてください。
int function(void* Data) {
size_t _varSize = ((volatile DATA *)Data)->unsafe_variable;
// unsafe_variable is in some kind of shared memory and can change at any time
_ReadWriteBarrier();
// this does not prevent against CPU optimisations (MemoryBarrier would)
if (_varSize > x * y) { return FALSE;}
size_t size = _varSize - t * q;
function_xy(size);
return TRUE;
}