2017-09-15 114 views
0

的GCC-內置原子操作: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html如何實現原子操作?

我需要一個原子操作的添加調度研究與CAS。這是一個有點像內置函數__atomic_compare_exchange_n海灣合作委員會,但不同的:

  1. 函數原型就像這樣:bool atomic_compare_add(int &ptr, int &expected, int val)

  2. 功能執行atomiclyif (ptr != expected) { ptr = ptr + val; return true; } else { return false; }

我想要的功能是不同的 from __atomic_compare_exchange_n和__atomic_add_fetch,__atomic_comp are_exchange_n表示if (*ptr == *expected) { *ptr = desire; return true; } else { return false; },__atomic_add_fetch表示*ptr = *ptr + val; return *ptr;

如何在Linux gcc/g ++上實現該操作?

+0

的STL可能會解決你的問題無關compilder的:http://en.cppreference.com/w/cpp/atomic/atomic – OutOfBound

+0

的你發佈的鏈接描述'__atomic_add_fetch'字面上'__atomic_compare_exchange_n' 10行後,這似乎做你想做的。 – Frank

+0

考慮將您的邏輯改爲更常見的'if(ptr == expected){ptr = ptr + value; } else {do nothing}'並使用['atomic :: compare_exchange'](http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange) – rustyx

回答

0

謝謝大家,我有一個解決辦法:

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; 
}