本地静态函数 - 对象的初始化是线程安全的吗?

时间:2012-08-13 17:44:42

标签: c++ thread-safety lambda static-initialization

以下两个函数会产生不同的程序集,这些程序集告诉我它们是不同的。有人可以告诉我他们的不同之处是什么?并且函数本地静态变量初始化在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);
}

2 个答案:

答案 0 :(得分:8)

“最常见的编译器”可能与此不同,因为它们对C ++ 11的支持并不完全相同。

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

答案 1 :(得分:4)

正如Bo所说,当前的C ++标准要求静态变量初始化不会引入数据竞争。 (这当然只与动态初始化阶段有关。)例如,如果在初始化静态变量时查看GCC的输出,您确实会找到对__cxa_guard_acquire__cxa_guard_release__cxa_guard_abort围绕初始化。

Itanium C++ ABI实际上正式化了该机制。