我目前正在麻烦地正确理解新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); }
Run Code Online (Sandbox Code Playgroud)
现在我想把它正确地移植到C++ 11,并且想知道我该如何正确处理它.根据我对std :: atomic_fetch_add的理解,基本上需要一个原子积分值才能做到这一点.但是,我如何正确地实现这一点,以便我可以使用原子变量指向某个位置并增加该值?
谢谢!
您不能使用C++ 11工具来获取未声明为原子类型的变量的原子访问.您需要将数组替换uint64_t为数组std::atomic<uint64_t>.在许多平台上,这将具有与plain相同的大小和对齐方式uint64_t,但所有操作都将是原子操作.
然后,您可以使用data[pos].fetch_add(1,memory_order)指定的原子增量memory_order.如果你需要一个内存顺序std::memory_order_seq_cst(可能最接近GCC __sync_fetch_and_add),那么可以省略内存顺序,或者你可以使用增量运算符,例如data[pos]++.
| 归档时间: |
|
| 查看次数: |
4603 次 |
| 最近记录: |