使用Atomic在C ++ 11中连续,不同的序列

时间:2014-05-09 15:43:24

标签: c++ c++11 atomic

我有两个关于原子的问题:

1)以下代码是否保证在多线程设置中返回连续的,单调递增的序列而没有重复?

#include <atomic>

struct AtomicCounter {
    std::atomic<int> value;

    AtomicCounter() : value( 0 ) {}

    int getNextSequence(){
    return ++value;
    }
};

2)是否有更简单的初始化方法?这些都不起作用:

std::atomic<int> value ( 0 ) ;
std::atomic<int> value { 0 } ;
std::atomic<int> value=0;

提前致谢

2 个答案:

答案 0 :(得分:9)

  1. 是的,即使在并发环境中,您也会得到没有间隙或重复的序列。 &#34;单调增加&#34;意味着在调用者方面进行排序 - 在某种意义上定义事先发生的事情以及在事件发生的顺序定义之后发生的事情。例如,无法保证在几个并发线程中首先启动调用的线程必然会获得较小的值。
  2. atomic<int> value {0};是正确的语法(demo)。但是,并非所有C ++编译器都支持C ++ 11的非静态数据成员初始值设定项,因此使用C ++ 98的初始化列表可能是目前唯一可用的方法。
  3. 这是由各种编译器实现的link to C++11 feature lists

答案 1 :(得分:0)

  1. 是的。

  2. 您无法在类体内进行初始化,您需要使用当前正在使用的初始化列表语法。