有人可以验证以下内联汇编代码gcc的正确性进行比较和设置吗?

时间:2011-01-08 20:57:55

标签: gcc inline-assembly

它看起来对我的功能正常。我正在尝试为多线程应用程序实现一个计数器。由于计数器值可能超出整数范围,我使用64位。我不太确定线程的安全性,因为我们处理64位数字。

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 Shukla

1 个答案:

答案 0 :(得分: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位上工作。