2017-09-15 11 views
0

gcc에 내장 된 원자 작업 : 는 CAS와 opration을 추가 http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html원자 연산을 구현하는 방법은 무엇입니까?

내가 원자 조작이 필요합니다. 그것은 내장 기능 __atomic_compare_exchange_n gcc가처럼 조금,하지만 다른 :

  1. 그냥이 같은 함수 프로토 타입 : bool atomic_compare_add(int &ptr, int &expected, int val)

  2. 함수는 atomicly을 실행 if (ptr != expected) { ptr = ptr + val; return true; } else { return false; }

원하는 함수는 입니다.은 __atomic_compare_exchange_n에서 __atomic_add_fetch, __atomic_comp는 __atomic_add_fetch입니다. 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

: 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; 
} 
STL은이 compilder의 독립 문제가 해결 될 수