簡體   English   中英

使用QAtomicInt / QAtomicPointer進行原子讀取

[英]Atomic read with QAtomicInt/QAtomicPointer

在所有支持的體系結構中,如何在Qt4中原子地讀取QAtomicInt或QAtomicPointer的值? 我不關心這里的內存排序,我只是想確保如果另一個線程同時更改該值,我將不會讀取部分舊的,部分新的值。

在Qt4中,這些類只有int或T *的轉換運算符。 似乎有更新的代碼( http://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/thread/qbasicatomic.h ),它區分非原子load()和原子loadAcquire()。 C ++ 11 atomics也有一個原子載荷()( http://en.cppreference.com/w/cpp/atomic/atomic/load )。 這就是為什么我擔心Qt4提供的方法不夠安全。

我知道fetchAndAddRelaxed(0)應該可以工作,但它看起來像一個黑客,並且在性能方面可能不是最佳的。

基本上答案是肯定的。 實際上,所有現代平台都允許至少32位或64位原子加載/存儲, 前提是變量是對齊的。 (在這里使用的原子,你不會加載“部分”值)

現在Qt文檔沒有說明他們的原子使用基本(他們稱之為混淆非原子的) load()store() 'loadAcquire()',特別是`fetchAndAddRelaxed(0)'比你需要的更貴 - 'loadAcquire'是迄今為止最便宜的2。

如果我是你,我會簡單地使用load()和store()。 如果你想對Qt文檔提供更多保證,loadAcquire是最便宜的方式,而像x86這樣的體系結構就像load()。

最好的方法是使用C ++ 11 atomic和輕松的內存模型,這是你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM