如何从atomic数组返回atomic元素?返回atomic_ullong编译报错如何解决
报错原因
std::atomic 系列类型为了保证原子操作的语义正确性,显式删除了拷贝构造函数和拷贝赋值函数,完全禁止了原子对象的拷贝操作——因为原子对象的拷贝过程无法保证原子性,随意拷贝会引发不可预期的并发问题。
你代码中 get_stat 方法的返回值类型为 atomic_ullong(即 std::atomic<unsigned long long>),执行 return stats[index]; 时需要将数组中的原子对象拷贝构造为返回值临时对象,触发了被删除的拷贝构造函数,因此编译器抛出对应的错误。
解决方案
有两种常用的修复方案,可根据实际业务需求选择:
- 方案1:返回原子变量存储的普通数值(最常用,适配仅需要读取统计值的场景)
将返回值类型改为普通的unsigned long long,通过原子类型的load()方法线程安全地读取原子变量存储的数值,全程不需要拷贝原子对象本身:
// 修改后的 get_stat 方法 unsigned long long get_stat(int index) { return stats[index].load(); }
- 方案2:返回原子对象的引用(适配需要外部直接操作该原子变量的场景)
将返回值类型改为原子类型的左值引用,不需要拷贝原子对象,直接返回数组中原子对象的引用即可:
// 修改后的 get_stat 方法 atomic_ullong& get_stat(int index) { return stats[index]; }
注意:返回原子对象引用后,外部可直接对该原子变量进行读写操作,需要你自行保证多线程场景下的操作符合预期的并发逻辑。
内容的提问来源于stack exchange,提问作者rzambre
相关产品推荐
相关产品推荐

