C ++如何组成原子操作?

时间:2019-01-29 15:15:17

标签: c++ atomic

C ++原子是一件好事,我的问题只是它们如何组成。

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

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

因此,是否可以保证这些操作只能像在事务性内存中那样一步一步地执行

2 个答案:

答案 0 :(得分:8)

原子操作仅保证原子性(以及给定正确参数的相对顺序):不同线程上的其他操作无法干扰其操作。都是原子的两个操作仍然是两个操作,因此在它们之间可能会发生东西。

答案 1 :(得分:0)

不,不会对此有任何保证,这会使代码不安全(一个线程的值可能大于A,而增量可能会丢失place_st.exchange(0)

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