2011-01-08 4 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ビットで動作するように見えます。

関連する問題