线程安全性和静态变量/成员功能

Thread safety and static variables/member functions

本文关键字:成员 功能 变量 静态 安全性 线程      更新时间:2023-10-16

这不是关于静态初始化和线程安全的问题。由于标准中使用的措辞,因此可以保证它们在一起,因为C 11。
到目前为止,一切都很好。而是考虑以下课程:

struct S {
    static int id() noexcept {
        static int v = 0;
        return v++;
    }
    template<typename>
    static int value() noexcept {
        static const int v = id();
        return v;
    }
};

在这种情况下,在不同线程上对S::value<MyType>()进行的两个并发电话是安全的(如果我错了,请纠正我(。

是否也有两个并发电话,例如S::value<AType>()S::value<AnotherType>()安全?

据我所知,value本身根本不是问题,因为有不同的专业。但是,当涉及到id时,第一行(静态初始化(保证是线程安全的,但是在此之后的线上不适用。

因此,vvalue中具有相同的ATypeAnotherType的值。
另一方面,在valuev的静态初始化期间调用了id,因此我不确定我的期望的有效性
这就是为什么我要问。我的推理或上面的一块代码实际上不是安全的吗?

no。您必须进行同步,但是就您而言,这很简单:

struct S {
    static int id() noexcept {
        static std::atomic<int> v { 0 };
        return ++v;
    }
    template<typename>
    static int value() noexcept {
        static const int v = id();
        return v;
    }
};

注意,避免递增的好习惯。