xchg并不是交换两值,看一部分:
#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long) \
(v),(ptr),sizeof(*(ptr))))
static inline unsigned long __xchg(unsigned long x,
volatile void * ptr, int size)
{
switch (size) {
case 1:
__asm__ __volatile__("xchgb %b0,%1"
:"=q" (x)
:"m" (*__xg(ptr)), "0" (x)
:"memory");
break;
case 2:
__asm__ __volatile__("xchgw %w0,%1"
:"=r" (x)
:"m" (*__xg(ptr)), "0" (x)
:"memory");
break;
case 4:
__asm__ __volatile__("xchgl %0,%1"
:"=r" (x)
:"m" (*__xg(ptr)), "0" (x)
:"memory");
break;
}
return x;
}
它只是将第二个参数x放入寄存器中与第一个指针参数所指的内容交换,返回所指内容原先的值。谈不上两数交换值。但是它可以“原子”的设置ptr所指内容并取出原值,这正是我们想要的。
可以参考一下下面小程序的结果:
int main()
{
int i = 1,j = 2;
printf("i=%d, j=%d\n", i, j);
printf("xchg:%d\n", xchg(&i, j));
printf("i=%d, j=%d\n", i, j);
return 0;
}
结果为:
i=1, j=2
xchg:1
i=2, j=2
阅读(1967) | 评论(0) | 转发(0) |