InterlockedCompareExchange64 与 std::atomic compare_exchange
InterlockedCompareExchange64 vs std::atomic compare_exchange
std::atomic<>
compare_exchange() related and translated to/from MS InterlockedCompareExchange64 对非原子值有何影响?是否存在性能或语义差异?
例如,这些代码是否等价?
edit : 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_weak
和compare_exchange
,在语义上等同于
InterlockedCompareExchangeAcquire64
和 InterlockedCompareExchange64
?
这些代码在语义上是等价的。 int64_t
的无原子负载在这里无关紧要,因为 Interlocked*
系列函数提示 X86,其中所有负载都是原子的。
C++ 原子的行为有可能比 Interlocked*
函数稍快,因为编译器将生成直接 ASM 调用而不是调用函数。但是,编译器也可能识别 Interlocked*
函数。
std::atomic 是 C++ 标准。它是可移植代码,可以用任何兼容的编译器编译
Interlocked* 是 Windows SDK 中的 Windows 特定功能。因此该代码将不可移植。
std::atomic<>
compare_exchange() related and translated to/from MS InterlockedCompareExchange64 对非原子值有何影响?是否存在性能或语义差异?
例如,这些代码是否等价?
edit : 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_weak
和compare_exchange
,在语义上等同于
InterlockedCompareExchangeAcquire64
和 InterlockedCompareExchange64
?
这些代码在语义上是等价的。 int64_t
的无原子负载在这里无关紧要,因为 Interlocked*
系列函数提示 X86,其中所有负载都是原子的。
C++ 原子的行为有可能比 Interlocked*
函数稍快,因为编译器将生成直接 ASM 调用而不是调用函数。但是,编译器也可能识别 Interlocked*
函数。
std::atomic 是 C++ 标准。它是可移植代码,可以用任何兼容的编译器编译
Interlocked* 是 Windows SDK 中的 Windows 特定功能。因此该代码将不可移植。