InterlockedCompareExchange64 vs std :: atomic compare_exchange

时间:2016-04-25 19:02:11

标签: c++ multithreading c++11 atomic

std::atomic<> compare_exchange()如何在非原子值上与MS InterlockedCompareExchange64相关联并转换为MS Is there atomic increment with the check preconditions, that the atomic value was less than the specified value??是否存在性能或语义差异?

例如,这些代码是否相同?

编辑 :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;没有明确的原子载荷。

示例是https://social.technet.microsoft.com/Forums/windowsserver/en-US/467e5cab-2368-42de-ae78-d86b644a0e71/transfer-scheduled-tasks-to-server-2008?forum=winserverMigration的示例,并且接近有关如何使用compare_exchange_weak的教科书示例。

compare_exchange_weakcompare_exchange在语义上等同于 InterlockedCompareExchangeAcquire64InterlockedCompareExchange64

2 个答案:

答案 0 :(得分:1)

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

c ++原子有可能比Interlocked*函数稍微快一些,因为编译器会生成直接ASM调用而不是调用函数。但是,编译器也可能识别Interlocked*函数。

答案 1 :(得分:0)

std :: atomic是C ++标准。它是可移植的代码,可以使用任何兼容的编译器进行编译

Interlocked *是Windows SDK中特定于Windows的功能。因此,该代码将无法移植。