?
Ce document utilise Manuel du site Web PHP chinois Libérer
在頭文件<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
與所指向的值進(jìn)行原子比較expected
,如果相等,則用前者替換前者desired
(執(zhí)行讀取 - 修改 - 寫入操作)。否則,加載實(shí)際值所指向的obj
進(jìn)入*expected
(進(jìn)行負(fù)載操作)。
讀取 - 修改 - 寫入和加載操作的內(nèi)存模型分別為succ
和fail
。(1-2)版本memory_order_seq_cst
默認(rèn)使用。
函數(shù)的弱形式((2)和(4))允許虛假地失敗,即,*obj != *expected
即使它們是相等的。當(dāng)比較和交換處于循環(huán)中時(shí),弱版本將在某些平臺(tái)上產(chǎn)生更好的性能。當(dāng)一個(gè)弱的比較和交換需要一個(gè)循環(huán),而一個(gè)強(qiáng)大的循環(huán)不會(huì),強(qiáng)壯的一個(gè)更可取。
這是為所有原子對(duì)象類型定義的通用函數(shù)A
。該參數(shù)是指向易失性原子類型的指針,以接受非易失性和易失性(例如內(nèi)存映射I/O)原子變量的地址。C
是與之對(duì)應(yīng)的非原子類型A
。
OBJ | - | 指向要測(cè)試和修改的原子對(duì)象的指針 |
---|---|---|
expected | - | 指向預(yù)期在原子對(duì)象中找到的值的指針 |
disired | - | 如果按預(yù)期方式存儲(chǔ)在原子對(duì)象中的值 |
succ | - | 如果比較成功,則讀取 - 修改 - 寫入操作的存儲(chǔ)器同步排序。所有的值都是允許的。 |
fail | - | 如果比較失敗,則執(zhí)行加載操作的內(nèi)存同步排序。不能是memory_order_release或memory_order_acq_rel,并且不能指定比succ更強(qiáng)的排序 |
比較的結(jié)果: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);
(標(biāo)準(zhǔn)措辭中稱比較是以“value”的形式被DR 431改為“bitwise equality”)。
C11標(biāo)準(zhǔn)(ISO/IEC 9899:2011):
7.17.7.4 atomic_compare_exchange通用函數(shù)(p:283-284)
atomic_exchangeatomic_exchange_explicit(C11) | 用原子對(duì)象(函數(shù))的值交換一個(gè)值 |
---|
| C ++文檔:atomic_compare_exchange_weak,atomic_compare_exchange_strong,atomic_compare_exchange_weak_explicit,atomic_compare_exchange_strong_explicit |