gpt4 book ai didi

c++ - 使用 QAtomicInt/QAtomicPointer 进行原子读取

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:18 25 4
gpt4 key购买 nike

如何在 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 并且在性能方面可能不是最佳的。

最佳答案

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

现在 Qt 文档没有明确表示他们的原子使用基本的(他们称之为令人困惑的非原子)load()store() 提供此功能. “loadAcquire()”,尤其是“fetchAndAddRelaxed(0)”比您需要的要贵 - “loadAcquire”是目前这两个中最便宜的。

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

最好的方法是使用 C++11 原子和您想要的宽松内存模型。

关于c++ - 使用 QAtomicInt/QAtomicPointer 进行原子读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12936464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com