有沒有辦法來檢查一個值的讀/寫(加載/存儲)是否是原子?我有專門版本的併發容器,只能使用這些值,我想添加一個靜態斷言來防止意外誤用。原子讀/寫值的靜態斷言
對於x86_64上的所有基本類型,這是正確的,但對於所有平臺或所有長數據類型可能並非如此。另外,小結構和聯合也可能被分配一個原子操作(因爲它們只是被編譯爲使用相同大小的基本複製操作)。
有沒有辦法來檢查一個值的讀/寫(加載/存儲)是否是原子?我有專門版本的併發容器,只能使用這些值,我想添加一個靜態斷言來防止意外誤用。原子讀/寫值的靜態斷言
對於x86_64上的所有基本類型,這是正確的,但對於所有平臺或所有長數據類型可能並非如此。另外,小結構和聯合也可能被分配一個原子操作(因爲它們只是被編譯爲使用相同大小的基本複製操作)。
C++ 0x草稿在<原子的標頭中有一段宏,它表示沒有簡單的便攜方式來檢查它。
29.4無鎖屬性 [atomics.lockfree]
#define ATOMIC_CHAR_LOCK_FREE implementation-defined
#define ATOMIC_CHAR16_T_LOCK_FREE implementation-defined
#define ATOMIC_CHAR32_T_LOCK_FREE implementation-defined
#define ATOMIC_WCHAR_T_LOCK_FREE implementation-defined
#define ATOMIC_SHORT_LOCK_FREE implementation-defined
#define ATOMIC_INT_LOCK_FREE implementation-defined
#define ATOMIC_LONG_LOCK_FREE implementation-defined
#define ATOMIC_LLONG_LOCK_FREE implementation-defined
的宏表示其中的std ::原子<類型>可以在沒有鎖定來實現的類型,這意味着它們本身就是原子。
嗯,這是很好的信息。我可能能夠從中建立一系列靜態斷言(但它不是通用的)。 – 2011-04-04 15:32:06
我想技術上說這個標準定義的「原子」操作是無鎖的。這實際上可能比我想要的更具限制性。但至少是這樣。 – 2011-04-04 15:35:44
您擁有的唯一方法是轉儲生成的每個函數的程序集,並參考處理器供應商的說明以獲取指令的原子性保證。
你很擔心,[Sparc不能自動寫入32位](http://www.win.tue.nl/~aeb/linux/lk/lk-13.html)。但是我很難設想可以證明原子寫入的正確性的斷言。 – sarnold 2011-04-04 09:57:30