繁体   English   中英

c++ 如何组合原子操作?

[英]How does c++ compose atomic operations?

C++ 原子是好东西,我的问题只是它们如何组合在一起。

    uint64_t lpp = (place_st++ == A-1)? place_st.exchange(0) : place_st.load();

    ...
    atomic<uint64_t> place_st;
    ...

那么,是否可以保证这些操作只会像在事务内存中一样一一执行

原子操作只承诺原子性(以及给定正确参数的相对顺序):不同线程上的其他操作无法干扰它们的操作。 两个都是原子的操作仍然是两个操作,因此它们之间可能会发生一些事情。

不,不会有任何保证,使代码不安全(一个线程可能会看到一个大于A的值,并且增量可能会被place_st.exchange(0) '丢失'。

这里最简单的方法可能是将place_st视为“未包装”,然后手动执行uint64_t lpp = place_st++ % A以获得“已包装”版本。 除此之外,要获得这种行为,您基本上需要在循环中进行比较和交换(请参阅如何在 C++ 中为共享计数器实现简单的比较和交换),而不是原子增量,以获取增量和包装以原子方式行事。 由于您只对单个变量进行操作,因此您可以使用 CAS 来模拟您正在考虑的事务内存方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM