2012-10-17 101 views
4

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

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

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

回答

3

基本上答案是肯定的。幾乎所有現代平臺都允許至少32位或64位原子加載/存儲提供的變量是對齊的。 (原子用在這裏意思是說你不會加載一個「部分」的值)

現在Qt文檔沒有說清楚他們的原子是用基本的(他們稱之爲令人困惑的非原子的)load()store()。 'loadAcquire()',尤其是`fetchAndAddRelaxed(0)'比你所需要的要貴 - 'loadAcquire'是目前爲止最便宜的2個。'如果我是你,我會簡單地使用load()和商店()。如果你想更多的保證Qt文檔,loadAcquire是最便宜的方式,像x86這樣的架構就像load()。

最好的方法是使用C++ 11原子與輕鬆內存模型,這是你想要的。