【发布时间】:2013-10-28 05:57:24
【问题描述】:
请考虑下面的 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;
}
【问题讨论】:
-
pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf 在第 12 页的末尾。
-
@Acme 那么我们可以根据stackoverflow.com/questions/3659336/… 说我们对锁(标志值)的更新较少吗?如果我错了,请纠正我!那么,我们是在谈论更少更新的强大功能吗?
-
它们的工作方式有根本的区别。在 CompareAndSwap 中,在获取相似值时会进行比较和更新,在 Test-and-set 中,旧值在写入新值后返回,Test -and-set 不会有最新信息,因此每次都会覆盖,而 CompareAndSwap 会,因此只有在值相同时才会写入。
标签: c locking mutual-exclusion compare-and-swap test-and-set