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

Fir*_*ame 4 c++ atomic c++11

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

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

#include <atomic>

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

    AtomicCounter() : value( 0 ) {}

    int getNextSequence(){
    return ++value;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

std::atomic<int> value ( 0 ) ;
std::atomic<int> value { 0 } ;
std::atomic<int> value=0;
Run Code Online (Sandbox Code Playgroud)

提前致谢

das*_*ght 9

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

以下是各种编译器实现的C++ 11功能列表链接.

  • @ luk32这不会有点奇怪:C++ 11的支持程度[编译器与编译器的区别很大](http://cpprocks.com/c11-compiler-support-shootout-visual-studio- GCC-铛英特尔/).具体来说,MSVC支持atomic,但它不支持非静态数据成员初始值设定项. (2认同)