在Linux 2.6.11.12中,rwlock_t
的定义如下:
typedef struct {
volatile unsigned int lock;
#ifdef CONFIG_DEBUG_SPINLOCK
unsigned magic;
#endif
#ifdef CONFIG_PREEMPT
unsigned int break_lock;
#endif
} rwlock_t;
在rwlock_t
的定义中,lock
字段为unsigned int
。当我们想要获取读锁定时,read_lock()
最终会调用_raw_read_trylock()
static inline int _raw_read_trylock(rwlock_t *lock)
{
atomic_t *count = (atomic_t *)lock;
atomic_dec(count);
if (atomic_read(count) >= 0)
return 1;
atomic_inc(count);
return 0;
}
在此函数中,我们调用atomic_dec()
来减少lock
并检查它是否大于或等于零。但是,因为lock
是unsigned int
,lock
总是大于0!也就是说,此函数将始终返回1.
我猜测atomic_read()
会将结果转换为int
,但在i386 arch中,它被定义为
#define atomic_read(v) ((v)->counter)
我不知道unsigned int lock
是如何运作的。