比较两个原子整数Qt5

时间:2015-08-28 11:25:58

标签: c++ qt qt5 atomic

在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

但如果我这样做,比较操作仍然是原子的吗?在此操作正在进行时,正在比较的值是否会发生变化?

2 个答案:

答案 0 :(得分:1)

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

虽然在比较

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

值可能会发生变化。

运营商==在Qt4中可用

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

顺便说一句,

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

答案 1 :(得分:1)

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

最有可能的是,如果您的代码依赖于原子比较,那么您的设计是错误的。原子变量独立存在:每个原子变量都是原子变量,与其他原子变量无关。

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

问题与Qt没什么关系:它与std :: atomic没什么不同。

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