gpt4 book ai didi

c++ - 静态局部变量会被错误优化吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:06 24 4
gpt4 key购买 nike

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 但第二个线程看不到更改,因为它将值保存在寄存器中。这种非常糟糕的情况会发生吗?

我的意思是,通常只有局部变量以这种方式优化:它们被放入寄存器,然后从那里读取,而不是从主内存中读取。据我所知,不应以这种方式优化全局变量。但是静态局部变量呢?

最佳答案

静态局部变量有一个全局变量的生命周期,它只是有一个函数作用域。您必须像使用适当的全局变量(互斥/原子)一样保护它。

注意:如果您在多个线程中使用任何类型变量(我的意思是当线程使用相同变量时),那么您必须使其线程安全。甚至,如果它是一个全局变量。即使,如果变量存储在内存中。将变量存储在内存中并不能使其成为线程安全的。线程安全是一个问题,不是因为某些变量可能在寄存器中。可能有一个 CPU,其中不同的内核不会自动同步它们的缓存。因此,对于一个变量,每个核心的缓存中可能有多个值。

关于c++ - 静态局部变量会被错误优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45053275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com