2015-08-28 75 views
3

在Qt5中,QAtomicInt的一些操作已經消失,包括operator ==。比較兩個原子的整數Qt5

有誰知道我可以如何比較Qt5中的兩個QAtomicInts?舊的代碼是這樣的:

qAtomicInt a; 
qAtomicInt b; 
if(a == b) 
    //Do something 

據我瞭解文檔(http://doc.qt.io/qt-5/sourcebreaks.html)我可以做這樣的:

qAtomicInt a; 
qAtomicInt b; 
if(a.load() == b.load()) 
    //Do something 

但是,如果我不喜歡這樣,是比較操作仍然是原子?在進行此操作時,正在比較的值是否會更改?

回答

1

考慮到Qt5的變化,您的代碼似乎是正確的。您可以使用load()loadAcquire()來比較QAtomicInt

雖然這些操作,而你是在

if(a.load() == b.load()) 

值QAtomicInts可能改變比較整形本身被標記爲原子。

==操作符這Qt4的

http://doc.qt.io/qt-4.8/qatomicint.html#operator-eq-eq

可用沒有標記爲在文檔中的原子,順便說一句。

+0

雖然一個有趣和重要的信息,這個答案不提供解決方案。 – vsz

+0

所以你是說,雖然「如果(a.load()== b.load())不是原子的,因爲在比較過程中值可能會改變,即使在舊代碼中(這已經存在於Qt4時代)原子開始? – DrDonut

+0

@DDDonut是的,舊的代碼不是原子的,新的代碼也不是原子的。 – demonplus

1

通常不支持原子比較。在Qt 4中,原子整數之間的比較也不是原子的。僅僅因爲有一個operator==並不意味着它是原子的。

如果你的代碼依賴於原子比較,那麼很可能你的設計是錯誤的。原子變量獨立存在:每個原子都是獨立的,與其他原子無關。

如果您確實需要一對可以進行原子比較的整數,則需要將它們全部放入單個原子變量中。例如。兩個16位整數適合32位原子整數,四個16位整數適合64位原子整數等。原子比較然後是一個負載,然後在你剛剛原子加載的部分進行比較。

這個問題與Qt沒有多大關係:它與std :: atomic沒有任何區別。

如果您需要的不止是無鎖原子提供的,您將很好地保護通過互斥鎖訪問數據。在無可爭議的情況下,Qt和其他良好實施的互斥鎖使用原子進行同步,因此無爭議的互斥鎖的開銷與原子比較和存儲相同。

+0

謝謝你的澄清。最後它解決了上面評論中描述的問題。 - 原子比較會給我的問題,時間會說:) – DrDonut