是本地的静态函数对象的初始化线程安全的?(Is initialization of local st

2019-07-30 23:38发布

下面的两个功能产生不同的组件,它告诉我,他们是不同的。 谁能告诉我用什么方式,他们有什么不同? 而在FUNC2线程安全与否的函数局部静态变量的初始化? 如果答案取决于编译器,我想知道如何将最常见的编译器与FUNC2行为。

int func1(int val)
{
    const auto impl = [](int v)
    {
        return v * 10;
    };

    return impl(val);
}

int func2(int val)
{
    static const auto impl = [](int v)
    {
        return v * 10;
    };

    return impl(val);
}

Answer 1:

“最常见的编译器”可能在这个不同,因为他们还没有全部为C ++ 11同样的支持。

在C ++ 11的静态变量的初始化是线程安全的。 在C ++ 03它不是(在目前还没有根据标准的任何线程)。



Answer 2:

正如薄熙来说,当前的C ++标准要求静态变量初始化没有引进一个数据的比赛。 (当然这是只对动态初始化阶段相关的。)例如,如果你初始化静态变量时看GCC的输出,你会发现确实调用__cxa_guard_acquire__cxa_guard_release__cxa_guard_abort周围的初始化。

在安腾C ++ ABI实际上形式化的机制。



文章来源: Is initialization of local static function-object thread-safe?