0
我在MCS鎖的描述中遇到了一條原子「獲取和存儲」指令。gcc的原子測試和設置內建與原子獲取和存儲操作相同嗎?
從我收集的內容,這原子地寫入一個值到內存位置並返回該內存位置的原始值,是正確的?
,是gcc的原子內建命令,
同一個原子取和存?
我在MCS鎖的描述中遇到了一條原子「獲取和存儲」指令。gcc的原子測試和設置內建與原子獲取和存儲操作相同嗎?
從我收集的內容,這原子地寫入一個值到內存位置並返回該內存位置的原始值,是正確的?
,是gcc的原子內建命令,
同一個原子取和存?
根據GCC info page,這確實是原子的,但它不是基本的原子獲取和存儲。
(這是從4.4手動夾緊,所以不同的區段號)
5.48內置函數用於原子存儲器訪問
(...)
TYPE __sync_fetch_and_add (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_sub (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_or (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_and (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_xor (TYPE *ptr, TYPE value, ...) TYPE __sync_fetch_and_nand (TYPE *ptr, TYPE value, ...) TYPE __sync_add_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_sub_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_or_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_and_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_xor_and_fetch (TYPE *ptr, TYPE value, ...) TYPE __sync_nand_and_fetch (TYPE *ptr, TYPE value, ...) bool __sync_bool_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...) TYPE __sync_val_compare_and_swap (TYPE *ptr, TYPE oldval TYPE newval, ...) __sync_synchronize (...) TYPE __sync_lock_test_and_set (TYPE *ptr, TYPE value, ...) void __sync_lock_release (TYPE *ptr, ...)
它們顯然取自Intel Itanium參考手冊,但是GCC在它們可以使用的任何CPU上實現它們(並警告如果您在不使用CPU的CPU上使用,然後使用非ato麥克風版本)。您記下的功能實際上是一個擴展的內存屏障(或關鍵區域):屏障由__sync_lock_test_and_set
確定,並由__sync_lock_release
發佈。
如果你正在尋找一個基本的原子獲取和設置,它可能是__sync_val_compare_and_swap
,雖然在大多數情況下,你會想使用一個更具體的版本。
您確定可以通過compare_and_swap實現fetch_and_store嗎? – 2013-04-08 22:48:15