10

GCC の組み込みのアトミック操作を認識しています: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html

ただし、このリストには、ロードやストアなどの非常に単純な操作は含まれていません。インラインアセンブリを使用して制限付きアーキテクチャでこれらを実装できます (実際、x86 のような多くの場合、基本的には通常の mov になります) が、一般的なケースでは次のようなものよりも良い方法はありません:

// returns the value at ptr
void *atomic_load_ptr(void **ptr)
{
    return __sync_fetch_and_add(ptr, 0);
}

// returns old value int ptr after setting it to newval
void *atomic_store_ptr(void **ptr, void *newval)
{
    void *oldval = atomic_load_ptr(ptr)
    void *oldval2;
    do {
        oldval2 = oldval;
    } while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2);
    return oldval;
}
4

1 に答える 1