|
发表于 2004-12-9 03:43:26
|
显示全部楼层
个人认识:
glibc为了实现pthread的跨平台将函数实现置于sysdep之上。
所以我们看代码的时候总觉得在绕圈子一样。
pthread_mutex_lock终究会到sysdep上面的。
看看代码这里还挺有意思的,386上面没有lock指令,所以glibc就来了这么一段sysdep/i386/pthread_spin_lock.c
- int
- pthread_spin_lock (lock)
- pthread_spinlock_t *lock;
- {
- asm ("\n"
- "1:\t" LOCK_PREFIX "decl %0\n\t"
- "jne 2f\n\t"
- ".subsection 1\n\t"
- ".align 16\n"
- "2:\trep; nop\n\t"
- "cmpl $0, %0\n\t"
- "jg 1b\n\t"
- "jmp 2b\n\t"
- ".previous"
- : "=m" (*lock)
- : "0" (*lock));
- return 0;
- }
复制代码
整个一个忙等。
到了486及其以后就简单多了,直接使用lock指令sysdep/i486/pthread_spin_trylock.S:
- #ifdef UP
- # define LOCK
- #else
- # define LOCK lock
- #endif
- .globl pthread_spin_trylock
- .type pthread_spin_trylock,@function
- .align 16
- pthread_spin_trylock:
- movl 4(%esp), %edx
- movl $1, %eax
- xorl %ecx, %ecx
- LOCK
- cmpxchgl %ecx, (%edx)
- movl $EBUSY, %eax
- #ifdef HAVE_CMOV
- cmovel %ecx, %eax
- #else
- jne 0f
- movl %ecx, %eax
- 0:
- #endif
- ret
- .size pthread_spin_trylock,.-pthread_spin_trylock
复制代码
所以原子操作是可以保证的。 |
|