如何在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 ++中同步静态字段的主要内容,如果未能解决你的问题,请参考以下文章