2013-10-28 19 views
1

請考慮比較並交換了下面的一段代碼,讓我知道爲什麼這個原子指令是比原子檢查並設置更強大,作爲一個互斥原始?爲什麼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

有一個在他們如何work.In比較並交換有一個比較和更新在得到類似的價值發生根本的區別,在檢查並設置寫入新的值後,返回舊的值,檢查並設置將不會有最新的信息,因此每次都會覆蓋,而CompareAndSwap將會因此只會在值相同時寫入。 – Sadique

回答

0

測試和設置修改內存位置的內容並返回其舊值作爲單個原子操作。

比較並交換原子內存位置的內容進行比較,以給定的值,並且,只有當它們是相同的,修改該內存位置的內容,以給定的新值。

相關問題