2011-01-08 80 views
0

它在我看來的功能工作正常。我正在嘗試爲多線程應用程序實現一個計數器。由於計數器值可能超出整數範圍,因此我使用了64位。我不太清楚線程安全性,因爲在這裏我們正在處理64位數字。有人可以驗證以下內聯彙編代碼gcc的比較和設置的正確性嗎?

UINT64 get_and_increment(volatile UINT64* dest) { 

    UINT64 old_value, new_value; 
    bool result = false; 
    while(!result) { 
     old_value = *dest; 
     new_value = old_value + 1; 

     __asm__ volatile (
          "lock cmpxchg %3, %1 \n setzb %0" 
          : "=m"(result), "+m" (*dest) 
          : "a" (old_value), "r"(new_value) 
          ); 
    } 
    return old_value; 
} 

感謝

Sudhanshu舒克拉

回答

2

爲什麼不使用GCC's built-in atomic intrinsics

UINT64 get_and_increment(volatile UINT64* dest) { 
    UINT64 old_value, new_value; 
    do { 
     old_value = *dest; 
     new_value = old_value + 1; 
    } while (!__sync_bool_compare_and_swap(dest, old_value, new_value)); 
    return old_value; 
} 

甚至

UINT64 get_and_increment(volatile UINT64* dest) { 
    return __sync_fetch_and_add(dest, 1); 
} 

話雖這麼說,你的組件將不會在32位平臺上運行(缺少64位lock cmpxchg),並且會更簡單寫爲lock xadd無循環,但看起來它可以在64位上工作。