它看起来对我的功能正常。我正在尝试为多线程应用程序实现一个计数器。由于计数器值可能超出整数范围,我使用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
答案 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位上工作。