C++静态初始化程序 - 它是否是线程安全的

Che*_*eng 2 c++

通常,当我尝试初始化静态变量时

class Test2 {
public:
    static vector<string> stringList;
private:
    static bool __init;
    static bool init() {
        stringList.push_back("string1");
        stringList.push_back("string2");
        stringList.push_back("string3");

        return true;
    }
};

// Implement
vector<string> Test2::stringList;
bool Test2::__init = Test2::init();
Run Code Online (Sandbox Code Playgroud)
  1. 在静态变量初始化期间,以下代码线程是否安全?
  2. 有没有更好的方法来静态初始化stringlist,而不是使用单独的静态函数(init)?

虽然初始化应该在main函数之前发生(因此,没有线程可以同时访问init),我关心的是:

  1. 我有一个exe应用程序.
  2. 我的exe应用程序将加载a.dll,b.dll和c.dll
  3. a/b/c.dll反过来会加载common.dll.上面的代码在common.dll中
  4. 我已经验证了.由于3个dll在单个进程内,因此它们将引用相同的静态变量(向量).
  5. 在这种情况下,为了防止3个dll同时访问init(我可以将它们视为3个线程吗?虽然初看起来没有意义),对于init函数,我应该使用临界区来保护它吗?

我使用的是Windows XP,VC6和VC2008编译器.

Bil*_*eal 7

在静态变量初始化期间,以下代码线程是否安全?
这完全取决于您的编译器.该标准绝对没有关于多线程的说法.

有没有更好的方法来静态初始化stringlist,而不是使用单独的静态函数(init)?
首先,你需要删除名称前面的__s(那是两个下划线); 任何以__开头的名称都是根据标准保留的.(在某些情况下,也不允许使用单个下划线 - 最好只是避免在名称上引入下划线)

这完全取决于向量是否需要在运行时更改.如果没有,你可能只是使用内置数组:

static const char *strings[] = {
    "string1",
    "string2",
    "string3"
};
Run Code Online (Sandbox Code Playgroud)