4

在所有支持的架构上,如何在 Qt4 中以原子方式读取 QAtomicInt 或 QAtomicPointer 的值?我不关心这里的内存顺序,我只想确保如果另一个线程同时更改值,我不会读取部分旧的、部分新的值。

在 Qt4 中,这些类只有 int 或 T* 的强制转换运算符。似乎有更新的代码(http://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/thread/qbasicatomic.h)区分非原子load()和原子loadAcquire()。C++11 原子也有一个原子 load() ( http://en.cppreference.com/w/cpp/atomic/atomic/load )。这就是为什么我担心Qt4提供的方法不够安全。

我知道 fetchAndAddRelaxed(0) 应该可以工作,但它看起来像一个 hack,并且在性能方面可能不是最佳的。

4

1 回答 1

3

基本上答案是肯定的。几乎所有现代平台都允许至少 32 位或 64 位原子加载/存储,前提是变量是对齐的。(此处使用原子的意思是您不会加载“部分”值)

现在 Qt 文档没有明确说明他们的原子使用基本(他们称之为令人困惑的非原子)load()store(). 'loadAcquire()' 尤其是 'fetchAndAddRelaxed(0)' 比你需要的更贵 - 'loadAcquire' 是这两个中最便宜的。

如果我是你,我会简单地使用 load() 和 store()。如果你想对 Qt 文档有更多的保证,loadAcquire 是最便宜的方法,在 x86 这样的架构中就像 load()。

最好的方法是将 C++11 atomic 与您想要的宽松内存模型一起使用。

于 2013-05-30T23:29:10.200 回答