在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
但如果我这样做,比较操作仍然是原子的吗?在此操作正在进行时,正在比较的值是否会发生变化?
答案 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和其他良好实现的互斥锁使用原子进行同步,因此无争议的互斥锁的成本与原子比较和存储的成本相同。