比较两个原子整数 Qt5

Compare two atomic ints Qt5

在 Qt5 中,QAtomicInt 上的一些操作已经消失,包括运算符==。

有谁知道我如何在 Qt5 中比较两个 QAtomicInts?旧代码是这样的:

qAtomicInt a;
qAtomicInt b;
if(a == b)
    //Do something

据我了解文档 (http://doc.qt.io/qt-5/sourcebreaks.html) 我可以这样做:

qAtomicInt a;
qAtomicInt b;
if(a.load() == b.load())
    //Do something

但是如果我这样做,比较操作仍然是原子的吗?正在进行此操作时,正在比较的值是否可以更改?

考虑到 Qt5 中的更改,您的代码似乎是正确的。您可以使用 load()loadAcquire() 来比较 QAtomicInt.

尽管在

中比较整数时这些操作本身被标记为原子操作
if(a.load() == b.load())

QAtomicInts 中的值可能会更改。

Operator== 在 Qt4 中可用

http://doc.qt.io/qt-4.8/qatomicint.html#operator-eq-eq

顺便说一句,

在文档中没有被标记为原子。

一般不支持原子比较。原子整数之间的比较在 Qt 4 中也不是原子的。仅仅因为有一个 operator== 并不意味着它是原子的。

很可能,如果您的代码依赖于原子比较,那么您的设计是错误的。原子变量独立存在:每个变量只有在与其他变量隔离时才是原子的。

如果你真的需要一对可以原子比较的整数,你需要将它们全部放入一个原子变量中。例如。两个 16 位 int 适合 32 位原子 int,四个 16 位 int 适合 64 位原子 int,等等。原子比较是一个负载,然后是对你刚刚原子加载的部分进行比较。

这个问题与 Qt 没有太大关系:它与 std::atomic 没有什么不同。

如果您需要的不仅仅是无锁原子提供的,您可以通过互斥锁保护对数据的访问。在无争议的情况下,Qt 和其他实现良好的互斥锁使用原子进行同步,因此无争议的互斥锁与原子比较和存储的成本相同。