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,但是第二个线程不会看到更改,因为它将值保存在寄存器中。这种情况真的会发生吗?
我的意思是,通常只有局部变量是这样优化的:它们被放到寄存器中,然后从那里读取,而不是从主内存中读取。正如我所理解的,不应该以这种方式优化全局变量。但是静态局部变量呢?
发布于 2017-07-12 01:26:53
静态局部变量具有全局变量的生存期,它只有一个函数范围。您必须以使用适当的全局变量(互斥/原子)的方式保护它。
注:--如果在多个线程中使用任何类型的变量(我指的是当线程使用相同的变量时),则必须使其线程安全。即使它是一个全局变量。即使变量存储在内存中。将变量存储在内存中并不会使其线程安全。线程安全不是因为某些变量可能在寄存器中而引起的关注。可能有一个CPU,不同的内核不会自动同步它们的缓存。因此,对于一个变量,每个核心的缓存中可能有多个值。
https://stackoverflow.com/questions/45053275
复制相似问题