std::atomic<> compare_exchange()如何与非原子值相关并与MS InterlockedCompareExchange64相互转换?是否存在性能或语义上的差异?

例如,这些代码是否等效?

编辑:David Haim指出应该是int64_t atomic_inc_ms(volatile int64_t& val, int64_t less_than)

int64_t atomic_inc_ms(int64_t& val, int64_t less_than) {
 int64_t new_val;
 int64_t old_val = val;
 while(true)
 {
   if (old_val > less_than) return old_val;
   new_val = old_val + 1;
   int64_t got_val = InterlockedCompareExchange64(&val,new_val,old_val);
   if(got_val == old_val) break;
   old_val = got;
 }

 return new_val;
}




int64_t atomic_inc(std::atomic<int64_t>& val, int64_t less_than) {
 int64_t new_val;
 int64_t old_val = val.load();
 do
 {
   if (old_val > less_than) return old_val;
   new_val = old_val + 1;
 } while (!val.compare_exchange_weak(old_val, new_val));

 return new_val;
}


一个问题是没有明显的原子负载的行int64_t old_val = val;

该示例是Is there atomic increment with the check preconditions, that the atomic value was less than the specified value?的示例,与关于如何使用compare_exchange_weak的教科书示例非常接近。

compare_exchange_weakcompare_exchange,在语义上等同于
InterlockedCompareExchangeAcquire64InterlockedCompareExchange64

最佳答案

这些代码在语义上是等效的。这里int64_t的原子负载没有问题,因为Interlocked*族函数提示X86,其中所有负载都是原子的。

由于编译器将直接生成ASM调用而不是调用函数,因此c ++原子的行为可能会比Interlocked*函数快一些。但是,编译器也可以识别Interlocked*函数。

关于c++ - InterlockedCompareExchange64与std::atomic compare_exchange,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36848978/

10-11 23:01