Qt中枚举的原子访问

Qt中枚举的原子访问,qt,atomic,Qt,Atomic,所以我试着做这样的事情 enum MyEnum { A =0, B, C }; QAtomicInteger< MyEnum > myVariable; 但我知道这被认为是不可移植的。volatile与原子性无关 没有“枚举的原子访问”这样的东西。枚举是编译时构造,原子访问是运行时的事情 枚举不是整数,即使其值本质上是整数。因此,以下代码将起作用: QAtomicInt myVar; myVar.store(A); 您可能还注意到,此代码不会编译

所以我试着做这样的事情

enum MyEnum
{
    A =0,
    B,
    C
};

QAtomicInteger< MyEnum > myVariable;

但我知道这被认为是不可移植的。

volatile
与原子性无关

没有“枚举的原子访问”这样的东西。枚举是编译时构造,原子访问是运行时的事情

枚举不是整数,即使其值本质上是整数。因此,以下代码将起作用:

  QAtomicInt myVar;
  myVar.store(A);
您可能还注意到,此代码不会编译:

  MyEnum ev = 0; // invalid conversion

QAtomicInteger
不应与枚举一起使用。只需使用标准库中的
std::atomic
(您需要启用
C++11
或更高版本)。

枚举值始终为只读。让它们原子化有什么意义吗?@jaskmar线程1写入myVariable,线程2读取myVariable。请尝试
std::atomic
enum class MyEnum:int{/*…*/}
。类型化的枚举也不起作用。然而,std原子会。不,伏尔泰与优化有关。因此,如果一个线程写入
myVariable
,然后阻塞
emit signal()
到另一个线程(写入
myVariable
),然后读取myVariable,优化器不会假定
myVariable
未被更改,并优化读取。@infixed-
volatile
用于变量可能从代码外部更改的情况,例如硬件中断或类似情况。它与多线程无关。而且它不会以任何方式阻止潜在的竞争条件<代码>易失性将删除某些优化,但访问不是原子的。这两个概念是根本不同的事情。<代码> Value确实是可变原子,但仅使用Visual C++编译器!它与C++标准无关,所以你不认为另一个线程是“一个线程之外的代码”吗?是的,如果欠放操作不是原子操作(如可中断的多字节操作),则它不是线程安全的。但是
enum
的实现很少是这样。正如我所说,我正试图避免它。不,我没有。一个常见的误解是,
volatile
是关于多线程的。事实并非如此。它用于与硬件接口,当有可能从进程外部更改值时,例如,通过硬件中断。这是关于不将变量保存在寄存器中,而是始终从内存读取和写入内存,以便数据可以与访问它的硬件接口同步。这在当前正在进行的故事中确实有效,但有点令人失望,由于
QAtomicInteger
的目标似乎与
std::atomic
的目标相同,因此没有充分的理由说明is不应该工作<代码>标准::原子显示这是可能的。。我们确实有其他项目仍然使用MVS2010使用QT,现在我们将没有选择重用这些项目上的代码,因为MVS2010不是C++。11@infixedMSVC2017也不支持100%C++11。使用MS编译器时,脑子里总是想着“重用代码”,这是一种疯狂。但在Windows上,你没有太多选择。
  MyEnum ev = 0; // invalid conversion