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所指内容并取出原值,这正是我们想要的。
可以参考一下下面小程序的结果:
#include
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
阅读(5330) | 评论(0) | 转发(0) |