我正在查看一些源代码,我想知道以下是否是线程安全的?我听说过编译器或 CPU 指令/读取重新排序(它与分支预测有关吗?)并且下面的 Data->unsafe_variable 变量可以随时由另一个线程修改。
我的问题是:根据编译器/CPU 重新排序读/写的方式,下面的代码是否有可能允许两次获取 Data->unsafe_variable?(见第二个片段)
注意:我不担心第一次访问,只要不通过'if',任何数据都可以在那里,我只是担心在'if'之后再次获取数据的可能性。我还想知道在这里转换为 volatile 是否有助于防止双重获取?
int function(void* Data) {
// Data is allocated on the heap
// What it contains at this point is not important
size_t _varSize = ((volatile DATA *)Data)->unsafe_variable;
if (_varSize > x * y)
{
return FALSE;
}
// I do not want Data->unsafe_variable to be fetch once this point reached,
// I want to use the value "supposedly" stored in _varSize
// Would any compiler/CPU reordering would allow it to be double fetched?
size_t size = _varSize - t * q;
function_xy(size);
return TRUE;
}
出于安全原因,基本上我不希望程序像这样运行:
_varSize = ((volatile DATA *)Data)->unsafe_variable;
if (_varSize > x * y)
{
return FALSE;
}
size_t size = ((volatile DATA *)Data)->unsafe_variable - t * q;
function10(size);
我在这里简化,他们不能使用互斥锁。但是,在第一行之后使用 _ReadWriteBarrier() 或 MemoryBarrier() 而不是 volatile 演员表会更安全吗?(VS编译器)
编辑:为代码提供更多上下文。