首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于add/sub/inc/dec,只需使用一个原子变量就足够了吗?

对于add/sub/inc/dec,只需使用一个原子变量就足够了吗?
EN

Stack Overflow用户
提问于 2015-08-07 12:48:58
回答 1查看 397关注 0票数 2

众所周知,当我们只使用一个原子变量来存储或加载( rel) (:https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html )时,就可以使用发布获取排序的。

但是,对于其他基本的无等待函数(例如:加法、减法、增量和递减),这是正确的吗?

也就是说,对于弱的(arm-cpu,.),next()函数在下面的C++代码中是否是安全的和强大(x86-cpu,.)内存模型,还是需要另一个障碍排序(较低/更高)?

代码语言:javascript
复制
#include <iostream>
#include <atomic>
using namespace std;

class progression_lf {
 public:
 progression_lf() : n(0) {}

 int next() {
    // memory_order_acq_rel - enough, and increases performance for the weak memory models: arm, ...
    int const current_n = n.fetch_add(1, std::memory_order_acq_rel);
    int result = 2 + (current_n - 1)*3;
    return result;
 }

 bool is_lock_free() { return ATOMIC_INT_LOCK_FREE; }

 private:
 std::atomic<int> n;
};

int main() {

    // reference (single thread)
    for(int n = 0; n < 10; ++n) {
        std::cout << (2+(n-1)*3) << ", ";
    }
    std::cout << std::endl;

    // wait-free (multi-thread safety)
    progression_lf p;
    for(int n = 0; n < 10; ++n) {
        std::cout << (p.next()) << ", ";
    }
    std::cout << std::endl; 

    std::cout << "lock-free & wait-free: " << 
        std::boolalpha << p.is_lock_free() << 
        std::endl;

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-07 18:49:06

如果您的线程只需要一个唯一的数字,恐怕这里不需要任何比轻松更强的C++内存排序。原子性就足够了,std::memory_order_relaxed保证:

放松操作:不存在同步或排序约束,此操作只需要原子性。

尽管实际上,具有原子读-修改-写操作的代码仍然会在x86上生成硬件指令,这意味着完全的内存屏障。

您可以看到不同的编译器为不同的平台生成了什么这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31878133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档