如何在C ++中同步静态字段

时间:2019-04-30 14:41:56

标签: c++ multithreading synchronization thread-safety

我希望在初始化时具有不同ID的对象。例如,假设我有一个名为“ Object”的类

public class Object {
   public:
      int id;
      static int tmp;
      Object() {
          id = tmp++;
      }
}

int Object::tmp = 0;

基本上,我想通过增加静态字段Object的值来为从类tmp初始化的对象分配唯一的ID。只有一个线程时,它应该工作。但是,当有多个可以初始化tmp的线程时,我应该怎么做才能同步静态字段Object

1 个答案:

答案 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 初始化阶段。


一种更有效的策略是使用特定于线程的计数器,以使线程不争用增加共享计数器。