使用引用初始化std::atomic是否会拷贝底层目标变量?
解答
你的判断完全正确,std::atomic<int> atomicref(ref) 初始化时确实拷贝了val的值,atomicref是独立于原变量的对象,修改它不会同步影响val和ref,核心原因如下:
std::atomic<T>的模板参数如果是普通值类型(如这里的int),其内部会独立开辟内存存储对应类型的值,和传入的初始化参数所在内存没有任何关联。你传入的ref是val的左值引用,本质就是val本身,构造atomicref时只会把val的当前值拷贝到atomicref的内部存储中,两者后续操作完全独立。std::atomic不支持引用类型作为模板参数,C++标准要求std::atomic的模板参数必须是可平凡复制(TriviallyCopyable)的类型,引用类型不满足该要求,因此你无法通过声明std::atomic<int&>让atomic绑定到外部的int变量。
对应你的运行结果:执行++atomicref时修改的是atomicref内部存储的int值,外部val所在的内存完全没有被修改,因此输出中ref和val的值仍为5,只有atomicref的内部值变为6。
如果你需要对变量做原子操作,有两种可选方案:
- 直接把目标变量声明为
std::atomic<int>类型,所有操作直接针对该变量进行即可:
std::atomic<int> val = 5; int& ref = val; // 这里ref是std::atomic<int>的引用 ++ref; // 原子操作,会直接修改val的值 std::cout<< "atomic val="<<val.load()<<" ref="<<ref.load();
- 如果你使用C20及以上标准,可以用
std::atomic_ref<int>绑定到普通int变量,实现对原变量的原子操作,该特性在你使用的C11标准中不可用。
内容的提问来源于stack exchange,提问作者BorisV
相关产品推荐
相关产品推荐

