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 的值,增量可能是 'lost' place_st.exchange(0).

这里最简单的做法可能是将 place_st 视为 "unwrapped",然后手动执行 uint64_t lpp = place_st++ % A 以获得 "wrapped" 版本。除此之外,要获得这种行为,您基本上需要在循环中进行比较和交换(参见 how to implement simple Compare And Swap in C++ for shared counter),而不是原子增量,以使增量和包装以原子方式运行。由于您只对单个变量进行操作,因此您可以使用 CAS 来模拟您正在考虑的事务性内存方法。