一、背景
又是关于汇编,头真是大,当年欠吴旭老师的汇编终究还是要还的。
在看nws源码的时候,里面有这样一段代码
static __inline__ unsigned long
atomic_cmp_set(volatile void *ptr, unsigned long old,
unsigned long set)
{
unsigned long prev;
__asm__ volatile(LOCK"cmpxchgq %2,%1"
: "=a"(prev), "+m"(*(volatile long *)(ptr))
: "r"(set), "0"(old)
: "memory");
return prev;
}
二、基础知识
这段代码是内嵌汇编代码(C与C++代码混合在一起叫内嵌汇编),为什么要使用内嵌汇编代码?可以大大的提升代码的运行速度,在nginx中广泛应用了CAS(compare-and-swap)操作来完成进程同步,也就是nginx的无锁机制,linux内核大量代码亦是如此(比如include/asm-i386/cmpxchg.h)