Когда я читаю орудие x86, функция сравнения и обмена выглядит так:
template <typename T>
bool compare_and_swap(T *dst, T exp, T desired)
{ // do atomically
if (*dst == exp) {
*dst = desired;
return true;
}
return false;
}
Мне интересно, переходит ли более одного потока к if (*dst==exp)
, и с тех пор exp
не был изменен, они могут одновременно передавать оператор if и выполнять *dst = desired
. Мне интересно, если это так, почему эта функция будет работать? Кажется, что это не останавливает другой поток, чтобы изменить данные? Может кто-нибудь любезно рассказать, как работает эта функция?