簡體   English   中英

如何執行原子操作?

[英]How to implement a atomic operation?

gcc內置的原子操作: http : //gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

我需要執行一次原子操作與CAS配合使用 它有點類似於gcc內置函數__atomic_compare_exchange_n,但有所不同:

  1. 函數原型如下所示: bool atomic_compare_add(int &ptr, int &expected, int val)

  2. 功能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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM