Пожалуйста, рассмотрите следующий фрагмент кода для CompareAndSwap и сообщите мне, почему эта атомная инструкция является более мощной, чем атомный TestAndSet для того, чтобы быть примитивным исключающим примитивом?Почему CompareAndSwap - это более мощная инструкция, чем TestAndSet?
char CompareAndSwap(int *ptr, int old, int new) {
unsigned char ret;
// Note that sete sets a ’byte’ not the word
__asm__ __volatile__ (
" lock\n"
" cmpxchgl %2,%1\n"
" sete %0\n"
: "=q" (ret), "=m" (*ptr)
: "r" (new), "m" (*ptr), "a" (old)
: "memory");
return ret;
}
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf В конце страницы 12. –
@Acme Итак, можно сказать, согласно http://stackoverflow.com/questions/3659336/compare-and-swap-vs-test-and-set у нас меньше обновлений для блокировки (значение флага)? Пожалуйста, поправьте меня, если я ошибаюсь! Итак, мы говорим об мощности с точки зрения меньшего количества обновлений? –
Существует принципиальная разница в том, как они работают. В CompareAndSwap есть сравнение и обновление происходит при получении одинакового значения, в Test-and-set старое значение возвращается после записи нового значения, Test-and-set не будет иметь и, следовательно, перезаписывает каждый раз, в то время как CompareAndSwap будет и, следовательно, будет писать, только если значение будет таким же. – Sadique