?
This document uses PHP Chinese website manual Release
在頭文件<stdatomic.h>中定義 | ||
---|---|---|
_Bool atomic_compare_exchange_strong(volatile A * obj,C * expected,C desired); | (1) | (自C11以來) |
_Bool atomic_compare_exchange_weak(volatile A * obj,C * expected,C desired); | (2) | (自C11以來) |
_Bool atomic_compare_exchange_strong_explicit(volatile A * obj,C * expected,C desired,memory_order succ,memory_order fail); | (3) | (自C11以來) |
_Bool atomic_compare_exchange_weak_explicit(volatile A * obj,C * expected,C desired,memory_order succ,memory_order fail); | (4) | (自C11以來) |
將所指向的值obj
與所指向的值進行原子比較expected
,如果相等,則用前者替換前者desired
(執(zhí)行讀取 - 修改 - 寫入操作)。否則,加載實際值所指向的obj
進入*expected
(進行負載操作)。
讀取 - 修改 - 寫入和加載操作的內存模型分別為succ
和fail
。(1-2)版本memory_order_seq_cst
默認使用。
函數(shù)的弱形式((2)和(4))允許虛假地失敗,即,*obj != *expected
即使它們是相等的。當比較和交換處于循環(huán)中時,弱版本將在某些平臺上產生更好的性能。當一個弱的比較和交換需要一個循環(huán),而一個強大的循環(huán)不會,強壯的一個更可取。
這是為所有原子對象類型定義的通用函數(shù)A
。該參數(shù)是指向易失性原子類型的指針,以接受非易失性和易失性(例如內存映射I/O)原子變量的地址。C
是與之對應的非原子類型A
。
OBJ | - | 指向要測試和修改的原子對象的指針 |
---|---|---|
expected | - | 指向預期在原子對象中找到的值的指針 |
disired | - | 如果按預期方式存儲在原子對象中的值 |
succ | - | 如果比較成功,則讀取 - 修改 - 寫入操作的存儲器同步排序。所有的值都是允許的。 |
fail | - | 如果比較失敗,則執(zhí)行加載操作的內存同步排序。不能是memory_order_release或memory_order_acq_rel,并且不能指定比succ更強的排序 |
比較的結果:true
如果*obj
等于*exp
,否則則返回false
。
行為atomic_compare_exchange_strong
就好像下面的代碼是以原子方式執(zhí)行的:
if (memcmp(obj, expected, sizeof *obj) == 0) memcpy(obj, &desired, sizeof *obj);else memcpy(expected, obj, sizeof *obj);
(標準措辭中稱比較是以“value”的形式被DR 431改為“bitwise equality”)。
C11標準(ISO/IEC 9899:2011):
7.17.7.4 atomic_compare_exchange通用函數(shù)(p:283-284)
atomic_exchangeatomic_exchange_explicit(C11) | 用原子對象(函數(shù))的值交換一個值 |
---|
| C ++文檔:atomic_compare_exchange_weak,atomic_compare_exchange_strong,atomic_compare_exchange_weak_explicit,atomic_compare_exchange_strong_explicit |