比较两个原子整数 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 和其他实现良好的互斥锁使用原子进行同步,因此无争议的互斥锁与原子比较和存储的成本相同。
在 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 和其他实现良好的互斥锁使用原子进行同步,因此无争议的互斥锁与原子比较和存储的成本相同。