我想确定下面的代码是否允许 CPU 获取 unsafe_variable 两次?假设由于 volatile 和 _ReadWriteBarrier(在 VS 上),编译器不会重新排序或优化代码。Mutex 不能在这里使用,我只关心潜在的双重获取的情况。
我不是 CPU 设计方面的专家,但我担心潜在的双重获取是:推测执行(性能优化技术,包括分支预测和预取技术)、寄存器和内存位置重命名以及重新排序缓冲区的使用和在一个或两个 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;
}