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

29

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

注意:我发现的这个错误报告提到了“std :: atomic enum支持”,但我没有看到C ++标准中提到原子枚举类型的任何说明,所以我不确定那是什么意思。


你所提供的错误报告解决起来相当干净利落,我认为:在GCC版本4.7之前不要使用<atomic> - Tim Seguine
2个回答

50

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

#include <atomic>

enum Decision {stay,flee,dance};
std::atomic<Decision> emma_choice {stay}; // emma_choice is atomic

您也可以使用枚举类来实现相同的操作:

#include <atomic>

enum class Decision {stay,flee,dance};
std::atomic<Decision> emma_choice {Decision::stay}; // emma_choice is atomic

2
很有趣,因为我之前写的是 emma_choice = Decision::stay,但编译失败了。将其改为 emma_choice { Decision::stay } 后就可以编译通过了。 - Alexis Wilke
2
@AlexisWilke 这是因为原子类型的复制赋值运算符被 delete 了。如果你做了像 emma_choice = Decision::stay 这样的事情,那么 Decision::stay 将首先被隐式转换为 std::atomic<Decision>,然后被复制,但这在原子类型中是不允许的。因此,您必须显式调用构造函数来初始化原子类型。 - Pacopenguin
2
@Pacopenguin 我相信在 C++17 中,由于强制复制省略https://en.cppreference.com/w/cpp/language/copy_elision,这不再适用。Clang 接受它。 - Ryan McCampbell

29

通用的 atomic 模板可用于所有可以轻松复制的类型,包括枚举。它是否是无锁的取决于实现;如果底层整数类型是,则希望它是无锁的。


18
可以使用 is_lock_free() 进行检查。 - stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接