我希望在初始化时具有不同ID的对象。例如,假设我有一个名为“ Object”的类
public class Object {
public:
int id;
static int tmp;
Object() {
id = tmp++;
}
}
int Object::tmp = 0;
基本上,我想通过增加静态字段Object
的值来为从类tmp
初始化的对象分配唯一的ID。只有一个线程时,它应该工作。但是,当有多个可以初始化tmp
的线程时,我应该怎么做才能同步静态字段Object
。
答案 0 :(得分:1)
但是当有多个可以初始化Object的线程时,我应该怎么做才能同步静态字段tmp。
您应使用std::atomic<unsigned>
作为计数器,以使其递增线程安全。 unsigned
,以确保包装计数器不会导致不确定的行为。
class Object {
static std::atomic<unsigned> tmp;
public:
unsigned const id = tmp.fetch_add(1, std::memory_order_relaxed);
};
std::atomic<unsigned> Object::tmp{0};
请注意,Object::tmp
的初始化发生在 dynamic 初始化调用任何全局对象的任何构造函数之前的 static 初始化阶段。
一种更有效的策略是使用特定于线程的计数器,以使线程不争用增加共享计数器。