2013-02-20 52 views
0

再次提到一些關於無鎖的問題...使用QAtomicInt作爲內存圍欄

假設我實現了一個基於數組的簡單循環FIFO整數。 FIFO由2個線程單個生產者,單個消費者訪問。讀取和寫入索引始終在訪問該項目後更新。在單個CPU上,這將是安全的(假設索引的更新操作是原子的),因爲只有一個線程具有對索引的寫入訪問權限。 在SMP機器上,這可能會導致問題,因爲由於其緩存和重新排序,兩個CPU可能會看到索引的不同表示。

QT有跨平臺的原子變量,它們也實現了內存圍欄,使用QAtomicInt使fifo實現SMP安全還是我忽略了一些東西?

回答

1

只要您的其他實施過程健全,這將是安全的。如你所說,QAtomicInt實現了memory fences,它們阻止了指令的重新排序,並且這也強化了處理器之間的高速緩存一致性(實際上x86和x86_64處理器的高速緩存無論如何都是一致的,儘管一致性協議可能導致流水線停頓,如果你在一個緊密的循環中依賴它,則會降低性能)。