所谓的CAS无锁是借助芯片提供的一些特性,主动检查锁状态。
x86芯片提供了cmpxchgl这条指令。
先列出32位的无锁函数,分为cas32_lock和cas32_unlock。
int cas32_lock(int *p)
{
asm
(
"pushl %%eax;\n\t"
"pushl %%ecx;\n\t"
"l1: movl %1, %%ecx;\n\t"
"movl %2, %%eax;\n\t"
"lock cmpxchgl %%ecx,%0;\n\t"
"jne l1;\n\t"
"popl %%ecx;\n\t"
"popl %%eax;\n\t"
:"+m"(*p):"i"(0),"i"(1)
:"%eax","%ecx"
);
return 0;
}
int cas32_unlock(int *p)
{
asm
(
"pushl %%eax;\n\t"
"movl %1, %%eax;\n\t"
"movl %%eax, %0;\n\t"
"popl %%eax;\n\t"
:"+m"(*p):"i"(1)
:"%eax"
);
return 0;
}
然后是64位的无锁函数实现cas64_lock,cas64_unlock
int cas64_lock(int *p)
{
asm