c++ 11中使用Atomic的连续的、不同的序列

Consecutive, distinct sequences in C++ 11 using Atomic

本文关键字:连续 c++ Atomic      更新时间:2023-10-16

关于原子我有两个问题:

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;

Thanks in advance

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

这里是c++ 11特性列表的链接,由不同的编译器实现。

  1. 是的。

  2. 你不能在类体内这样初始化,你需要使用当前使用的初始化列表语法。