2013-10-28 8 views
1

Пожалуйста, рассмотрите следующий фрагмент кода для 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; 
} 
+0

http://pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf В конце страницы 12. –

+0

@Acme Итак, можно сказать, согласно http://stackoverflow.com/questions/3659336/compare-and-swap-vs-test-and-set у нас меньше обновлений для блокировки (значение флага)? Пожалуйста, поправьте меня, если я ошибаюсь! Итак, мы говорим об мощности с точки зрения меньшего количества обновлений? –

+1

Существует принципиальная разница в том, как они работают. В CompareAndSwap есть сравнение и обновление происходит при получении одинакового значения, в Test-and-set старое значение возвращается после записи нового значения, Test-and-set не будет иметь и, следовательно, перезаписывает каждый раз, в то время как CompareAndSwap будет и, следовательно, будет писать, только если значение будет таким же. – Sadique

ответ

0

test-and-set изменяет содержимое ячейки памяти и возвращает ее старое значение как одну атомную операцию.

сравнение и замена атомно сравнивает содержимое ячейки памяти с заданным значением и, только если они совпадают, изменяет содержимое этой ячейки памяти на заданное новое значение.