我目前在正确理解新std::atomic
类型的用法方面遇到麻烦。就我而言,我有以下假设:
uint64_t
值的连续存储位置本来我实现了这样的方法
uint64_t inc(const size_t pos) { return _data[pos]++; }
uint64_t atomic_inc(const size_t pos) { return __sync_fetch_and_add(&_data[pos], 1); }
现在,我想将其正确移植到C++ 11,并且想知道如何正确处理。根据我对std::atomic_fetch_add的理解,基本上需要一个原子整数值来执行此操作。但是,我如何正确实现此方法,以便可以使用原子变量指向某个位置并增加该值?
谢谢!
最佳答案
你不能
C++ 11原子对象封装了其基本类型。它不提供对作为lvalue的值的访问,也不能将其设置为对基础类型的预先存在的对象(在给定的内存位置)提供原子操作。
根据平台的不同,任何给定的原子类型可能有特殊要求(例如,更严格的对齐约束)或需要辅助数据(大多数原子类型不能保证没有锁)
做您想做的事仍然需要特定于平台的功能。
如果要进行非原子增量,则最接近的是:
atomic<uint64_t> data(initial_value);
data.store(data.load(memory_order_relaxed) + 1, memory_order_relaxed);
这仍然会执行原子加载和存储,但不会执行内存隔离或原子读取-修改-写入操作。
关于c++ - C++ 11 std::atomic_fetch_add与__sync_fetch_and_add,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14858770/