线程安全性和静态变量/成员功能
Thread safety and static variables/member functions
这不是关于静态初始化和线程安全的问题。由于标准中使用的措辞,因此可以保证它们在一起,因为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
时,第一行(静态初始化(保证是线程安全的,但是在此之后的线上不适用。
因此,v
在value
中具有相同的AType
和AnotherType
的值。
另一方面,在value
中v
的静态初始化期间调用了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;
}
};
注意,避免递增的好习惯。
相关文章:
- 类模板的成员功能的定义在单独的TU中完全专业化
- 升压信号2将插槽传递到成员功能以断开连接
- 多次实现成员功能
- 私有成员数据不可用于公共成员功能
- 如何避免大多数成员功能相同的代码重复
- C 成员功能
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- C 朋友课程和朋友成员功能
- C 函数调用包装器包含类成员功能作为模板参数
- 创建类成员功能
- 成员功能C 的不同实现
- 返回类型不可知模板类成员功能
- C 11螺纹 - 非静态成员功能的使用无效 - 工作GCC 5.1.0损坏的GCC 7.3.1
- 超载类成员功能标记为const
- C 功能指针和成员功能指针
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 我可以使用Priority_queue的基础容器的成员功能
- 如何子类可运行任何成员功能
- 共享类时如何隐藏成员功能文件
- 从C文件访问C 类成员功能