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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中同步静态字段相关的知识,希望对你有一定的参考价值。

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

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

int Object::tmp = 0;

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

答案

但是当有多个线程可以初始化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的初始化发生在静态初始化阶段。


更有效的策略是使用特定于线程的计数器,以便线程不会在递增共享计数器时竞争。

以上是关于如何在C ++中同步静态字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用JNI管理C ++代码中的静态变量?

如何在编码阶段减少代码中的bug?

在 C 代码库中查找全局/静态变量的工具

我们如何在目标 c 中添加文本字段来推送通知? [复制]

Visual Studio:如果启用了编译器选项,如何测试(在代码/静态断言中)

如何在源代码中查找内存泄漏