看來,std::atomic
類型不復制可複製或可複製轉讓。 爲什麼?爲什麼std :: atomic對象不可複製?
有沒有技術原因,爲什麼複製原子類型是不可能的? 或者是有限的目的是爲了避免某種不良的代碼?
看來,std::atomic
類型不復制可複製或可複製轉讓。 爲什麼?爲什麼std :: atomic對象不可複製?
有沒有技術原因,爲什麼複製原子類型是不可能的? 或者是有限的目的是爲了避免某種不良的代碼?
技術原因:大多數原子類型不保證是無鎖的。原子類型的表示可能需要包含嵌入的互斥體,互斥體不可複製。
邏輯原因:複製原子類型意味着什麼?預計整個複製操作是否是原子的?該副本和原始代表相同的原子對象?
對於跨越兩個分開的原子對象的操作,沒有明確的含義會使這個值得。你可以做的一件事是將從一個原子對象加載的值轉移到另一個原子對象。但是,加載只與前一個對象上的其他操作同步,而存儲與目標對象上的操作同步。每個部分都可以帶有完全獨立的內存排序約束。
將這樣的操作解釋爲一個加載後跟一個存儲使得這個操作是顯式的,而賦值會讓人想知道它如何與參與對象的內存訪問屬性相關。如果你堅持,你可以通過結合std::atomic<..>
的現有轉換(需要明確的轉換或值類型的其他中間值)來實現類似的效果。
。
在沒有原子指令的平臺上(或者沒有針對所有整數大小的原子指令),類型可能需要包含一個互斥體來提供原子性。互斥體通常不可複製或移動。
爲了在所有平臺上爲所有專業化的std::atomic<T>
保持一致的界面,這些類型從不可複製。
+1, 我覺得這是原因,雖然我不確定是否發佈了答案。也許值得一提的是''is_lock_free()''成員函數,它應該告訴我一個實現是否確實依賴於原子指令 – 2013-03-06 14:38:05
我想你剛纔提到它:)謝謝。 JoergB也給出了一個很好的(第二個)原因,我不能說出來,所以沒有試圖解釋 – 2013-03-06 16:12:53