2009-05-02 28 views
10

我知道GCC的內建原子操作:http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Atomic-Builtins.html在GCC中實現泛型原子加載或存儲的更好方法?

但是這個列表並不包括非常簡單的操作,如加載和存儲。我可以實現這些與內聯彙編有限的體系結構(其實對於很多像86,他們將基本上只是普通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; 
} 
+0

如果我錯了,請阻止我,但您的「商店」功能並不是真正的商店,因爲它會返回舊值(所以它非常接近CAS)。 – claf 2009-05-04 08:56:38

回答

2

你可以用test_and_set實現低級別互斥鎖。加載函數是一個好的imo,但是你的存儲函數應該使用test_and_set代替

while ((oldval = __sync_val_compare_and_swap(ptr, oldval, newval)) != oldval2); 

來防止錯誤。