我想以原子方式递增内联程序集中的64位(C++中的长类型)计数器。我知道如何在32位值(int)上做到这一点:
asm volatile("lock; incl %0" : "=m" (val) : "m"(val));
但我不知道如何在长期价值上做到这一点。
将自我回答从问题移动到答案
这很容易,但我还不熟悉x86-64。
asm volatile("lock; incq %0" : "=m" (val) : "m"(val));
应该是:
asm volatile("lock; incq %0" : "+m" (val));
指定单独的操作数而不受强制输入到与输出相同位置的约束,可能会导致以下代码:
val = something;
asm volatile("lock; incq %0" : "=m" (val) : "m"(val));
被错误地优化。您可能还需要一个内存阻塞器,以防止对其他变量的访问被移过asm。