回头看多线程同步,突然想着实现一下互斥锁。于是花了近一天多的时间,凑活简单实现了下面两个机制。主要用汇编中xchg指令读值写值的原子操作,因为这个指令在执行时,存储器总线是被锁的,所以是安全的!
/*自旋锁*/
int lock=0;
void enter_region()
{
__asm__ __volatile__(
"1:movl $0x01,%%eax\n\t"
"xchg %0,%%eax\n\t"
"cmp $0x00,%%eax\n\t"
"jnz 1b\n\t"
:"+m"(lock)
::"eax");
}
void leave_region()
{
__asm__ __volatile__(
"movl $0x00,%0\n\t"
:"=m"(lock)
::);
}
/*互斥量*/
int mutex=0;
void mutex_lock()
{
__asm__ __volatile__(
"2:movl $0x01,%%eax\n\t"
"xchg %0,%%eax\n\t"
"cmp $0x00,%%eax\n\t"
"je 3f\n\t"
"call sched_yield\n\t"
"jmp 2b\n\t"
"3:\n\t"
:"+m"(mutex)
::"eax");
}
void mutex_unlock()
{
__asm__ __volatile__(
"movl $0x00,%0\n\t"
:"=m"(mutex)
::);
}
关于GCC Inline Assembly以及AT&T Assembly的相关语法规则,有兴趣的朋友可以自己查查文档资料。
还有很多东西没搞清楚!不过,鼓励一下自己,再接再厉!