1
std::uint64_t foo()
{
static std::uint64_t var = 0u;
std::lock_guard<std::mutex> lock(mutex);
std::uint64_t b;
do
{
b = bar();
}
while (b <= var);
var = b;
return b;
}
假設我們有兩個線程。讓第一個線程在調用lock()之前將變量var讀取到寄存器,並在調用lock()之前將第二個線程讀取變量var到寄存器。然後第一個線程更改var但第二個線程看不到更改,因爲它將值保存在寄存器中。這種情況真的很糟糕嗎?靜態局部變量是否可以被錯誤地優化?
我的意思是,通常只有局部變量是這樣優化的:它們被放到寄存器中,然後從那裏讀取,而不是從主存儲器中讀取。據我所知,全局變量不應該按照這種方式進行優化。但是靜態局部變量呢?
「* ...這種情況真的會發生嗎?*」 - 是的。 'std :: mutex'的同步效果是'unlock()'*與*'lock()'同步。但是你正在討論在lock()之前使用這個對象。互斥體提供的唯一保證是,在lock()''''lock''序列中線程** A **對'bar'的修改,對另一個線程來說是可見的,在** B **'lock()是互斥體之後** B **。 – WhiZTiM
您需要在使用之前鎖定資源,否則另一個線程可能會在賦值和鎖之間鎖定它,從而導致競爭條件 – Dynamitos
@WhiZTiM不* C++ 11 *保證線程安全的靜態? –