在Visual Studio 2017上查看<atomic>
中compare_exchange_weak的实现,在每种类型的内存排序中,它调用相同的函数:
inline int _Compare_exchange_release_4(volatile _Uint4_t *_Tgt,
_Uint4_t *_Exp, _Uint4_t _Value)
{ /* compare and exchange values atomically with
release memory order */
_Uint4_t _Old_exp = *_Exp; /* read before atomic operation */
_Uint4_t _Prev = _INTRIN_RELEASE(_InterlockedCompareExchange)((volatile long *)_Tgt,
_Value, _Old_exp);
if (_Prev == _Old_exp)
return (1);
else
{ /* copy old value */
*_Exp = _Prev;
return (0);
}
}
(代码是Release排序的一个例子,但函数的所有版本都是相同的)
所以它只使用内在的_InterlockedCompareExchange
,而且我在MSDN中看不到有关此功能失败的任何内容,那么这些检查的重点是什么?为什么不直接拨打_InterlockedCompareExchange
?