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

标签 c++ qt atomic

如何在 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/

相关文章:

c# - 如何在 C# 中捕获调用 C++ dll 的异常

c++ - 寻找更紧凑的语法(简单代码)——C++

c++ - Qt Designer 在加载 ui 时返回错误

c++ - 链接错误 : undefined reference for architecture x86_64 for Xcode 5

c++ - 如何创建一个窗口,当在窗口客户区按住鼠标指针时我们可以移动窗口?

database - 数据库是否可以支持 "Atomicity"但不支持 "Consistency",反之亦然?

c++ - C++中的内存泄漏/内存分配

redis - 原子 GETSET 操作有哪些用例?

c++ - memory_order_acquire 真的足以锁定自旋锁吗?

c++ - 奇怪的模板问题