[英]How to implement a atomic operation?
gcc內置的原子操作: http : //gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
我需要執行一次原子操作 : 與CAS配合使用 。 它有點類似於gcc內置函數__atomic_compare_exchange_n,但有所不同:
函數原型如下所示: bool atomic_compare_add(int &ptr, int &expected, int val)
功能atomicly執行: if (ptr != expected) { ptr = ptr + val; return true; } else { return false; }
if (ptr != expected) { ptr = ptr + val; return true; } else { return false; }
我想要的函數不同於 __atomic_compare_exchange_n和__atomic_add_fetch,__atomic_compare_exchange_n表示if (*ptr == *expected) { *ptr = desire; return true; } else { return false; }
if (*ptr == *expected) { *ptr = desire; return true; } else { return false; }
if (*ptr == *expected) { *ptr = desire; return true; } else { return false; }
和__atomic_add_fetch表示*ptr = *ptr + val; return *ptr;
*ptr = *ptr + val; return *ptr;
。
如何在Linux gcc / g ++上實現該操作?
謝謝大家,我有一個解決方案:
bool atomic_compare_add(int *ptr, int not_expected, int val) {
int old_val;
do {
old_val = __atomic_load_n(ptr, __ATOMIC_CONSUME);
if (old_val == not_expected) {
return false;
}
} while (!__atomic_compare_exchange_n(ptr, &old_val, old_val + val, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED));
return true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.