可以错误地优化静态局部变量吗?

时间:2017-07-12 09:08:45

标签: c++ multithreading static local compiler-optimization

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 ,但第二个线程没有看到更改,因为它将值保留在寄存器中。这真的很糟糕吗?

我的意思是,通常只有局部变量才这样优化:它们被放到寄存器中,然后从那里读取而不是从主存储器中读取。并且全局变量不应该像我理解的那样进行优化。但是静态局部变量呢?

1 个答案:

答案 0 :(得分:0)

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

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