2014-12-07 61 views
1

我想使用海灣合作委員會內置函數__atomic_compare_exchange()但我需要它稍微不同於它所指定的,我不確定它可能實現。海灣合作委員會內部原子比較和交換

的函數原型:

__atomic_compare_exchange(type *ptr, type *expected, type *desired, bool weak, int success_memmodel, int failure_memmodel)

它以原子比較ptrexpected並寫入desiredptr如果ptr == expected

我想要實現的是非常相似,但我expected!= NULL ,基本上我想檢查是否ptr != NULL,如果那是真的,則將desired寫入ptr

可以這樣做嗎?

這裏是關於它的使用GCC:

https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

回答

2

當然,不過你只需要調用它在一個循環。在每次循環迭代中,讀取舊值。如果它爲空,則跳出循環並返回失敗。如果它不爲空,則使用該舊值作爲原子比較和交換的「預期」。如果成功,退出循環並返回成功。否則重複。

順便說一下,這種通用方法是如何在比較和交換之上構造任意原子操作。

+0

但後來我失去了原子性,對我來說重要的是讀取比較和寫在一起是原子。如果不存在競爭條件,其中數據可以在讀取,比較和寫入之間改變 – 2014-12-07 05:41:56

+1

不,您不會失去原子性。這就是整個問題。原子比較和交換爲您提供了通過此方法進行的任何原子操作。如果數據在讀取舊值(以獲得「期望」)和原子cas之間發生變化,則cas失敗並重新開始。 – 2014-12-07 05:50:22

相關問題