簡體   English   中英

InterlockedCompareExchange64與std :: atomic compare_exchange

[英]InterlockedCompareExchange64 vs std::atomic compare_exchange

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; 沒有明確的原子負荷。

例如,在檢查先決條件是否存在原子增量,即原子值小於指定值? 並且與教科書中有關如何使用compare_exchange_weak示例非常接近。

從語義compare_exchangecompare_exchange_weakcompare_exchange是否等效於InterlockedCompareExchangeAcquire64InterlockedCompareExchange64

這些代碼在語義上是等效的。 由於Interlocked*系列函數提示X86,其中所有負載都是原子的,因此int64_t原子負載沒有關系。

由於編譯器將直接生成ASM調用而不是調用函數,因此c ++原子的行為可能會比Interlocked*函數的行為稍快一些。 但是,編譯器也可以識別Interlocked*函數。

std :: atomic是C ++標准。 它是可移植代碼,可以與任何兼容的編譯器一起編譯

互鎖*是Windows SDK中特定於Windows的功能。 因此,該代碼將不可移植。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM