微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

非局部变量的动态初始化是线程安全的

如何解决非局部变量的动态初始化是线程安全的

我的应用程序的源文件之一中有以下代码

// file1.cpp
#include <memory>

static auto global_variable = std::make_unique<int>(123);

int get_global_variable() { return *global_variable; }

假设我的应用程序有一些调用 get_global_variable 的线程。 global_variable 线程的初始化是否安全?

据我所知,global_variabledynamically initialized。我也知道从 C++11 开始,静态局部变量的初始化是 thread-safe。所以,我想知道这个异常是否证明了其他类型的变量不是线程安全初始化的规则,或者它也是线程安全的并且不产生 data races

我找到了这个 answer,但是读完之后,我更困惑了,因为回答者建议使用这样的模式:

const T& f()
{
    static T t(a,b,c);
    return t;
}

据说可以保证线程安全的初始化。

我也发现了这个 answer。它指出所有全局变量都在 main 之前初始化,因此只有一个线程(Peter 正确地指出它不是真的 - 或者不是每次都如此)。但是,如果我的一段代码是由 dlopen 函数加载到有多个线程的程序的共享库怎么办?

解决方法

[basic.start.dynamic]/4 静态存储期的非局部非内联变量的动态初始化是否在 main 或被推迟。如果它被延迟,它强烈发生在任何非内联函数或与要初始化的变量在同一翻译单元中定义的非内联变量的任何非初始化 odr 使用之前。

我相信这需要实现以线程安全的方式执行全局变量的初始化(如果它选择推迟这样的初始化)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。