2017-09-15 7 views
0

gccの内蔵型原子操作:AnはCASでopration追加http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.htmlアトミックな操作を実装する方法は?

私はアトミック操作を必要としています。 bool atomic_compare_add(int &ptr, int &expected, int val)

  • 機能がatomiclyを実行します:if (ptr != expected) { ptr = ptr + val; return true; } else { return false; }

    1. ちょうどこのような関数のプロトタイプ:それは少しgccの組み込み関数__atomic_compare_exchange_nが、異なるようなものです私が望む機能は、とは異なるから__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

    :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

    おかげで誰もが、私は1つのソリューションを持っている:

    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から独立して、あなたの問題解決かもしれません
    関連する問題