如何在C++中创建原子枚举?

Cer*_*ran 17 c++ enums atomic c++11

atomic包含许多不同变量类型的原子版本.但是,它不包含原子枚举类型.有没有办法使用原子枚举或自己制作?据我所知,我唯一的选择是不使用枚举或使用互斥锁/信号量来保护它们.

注意:我发现这个错误报告提到"std :: atomic enum support",但我没有在C++标准中看到任何提及原子枚举类型,所以我不确定它是指什么.

Mik*_*our 22

通用atomic模板可用于所有简单的可复制类型,包括枚举.它是否无锁是由实施决定的; 希望它是,如果基础整数类型是.

  • ...可以使用[is_lock_free()](http://en.cppreference.com/w/cpp/atomic/atomic/is_lock_free)查看 (9认同)

Cer*_*ran 19

您可以像这样创建一个原子枚举:

#include <atomic>

enum Decision {stay,flee,dance};
std::atomic<Decision> emma_choice {stay}; // emma_choice is atomic
Run Code Online (Sandbox Code Playgroud)

你也可以用枚举类做同样的事情:

#include <atomic>

enum class Decision {stay,flee,dance};
std::atomic<Decision> emma_choice {Decision::stay}; // emma_choice is atomic
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,我有相当于“emma_choice = Decision::stay”的东西,但它会失败。使用 `emma_choice { Decision::stay }` 更改它使其可以编译。 (2认同)
  • @AlexisWilke那是因为复制赋值运算符对于原子类型是“删除”的。如果你做了类似 `emma_choice = Decision::stay` 的事情,那么 `Decision::stay` 将首先隐式转换为 `std::atomic&lt;Decision&gt;`,然后复制过来,但这对于原子来说是不允许的。因此,您必须显式调用构造函数来初始化原子。 (2认同)
  • @Pacopenguin 我相信由于强制复制省略,C++17 中不再出现这种情况 https://en.cppreference.com/w/cpp/language/copy_elision。铿锵接受了。 (2认同)