当对某个数据结构的操作可以像这样被划分为读/写两种类别时,类似读/写锁这样的机制就很有用了。Linux的读写自旋锁为读和写分别提供了不同的锁,一个或多个读任务可以并发的持有读者锁;用于写的锁最多只能被一个写任务持有,而且此时不能有并发的读操作。有时候读写锁叫做共享排斥锁,或者并发排斥锁,因为这种锁以共享(对读者而言)和排斥(对写着而言)的形式获得使用。
- /*
- * Read-write spinlocks, allowing multiple readers
- * but only one writer.
- */
- 在<Spinlock_types.h(include/linux)>中
- typedef struct {
- raw_rwlock_t raw_lock;
- #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
- unsigned int break_lock;
- #endif
- #ifdef CONFIG_DEBUG_SPINLOCK
- unsigned int magic, owner_cpu;
- void *owner;
- #endif
- #ifdef CONFIG_DEBUG_LOCK_ALLOC
- struct lockdep_map dep_map;
- #endif
- } rwlock_t;
- 在<Spinlock.h(include/linux)>
- #define write_lock(lock) _write_lock(lock)
- #define read_lock(lock) _read_lock(lock)
- 在<Spinlock_api_up.>
- #define _read_lock(lock) __LOCK(lock)
- #define _write_lock(lock) __LOCK(lock)
- 在<hSpinlock.c(kernel)>
- void __lockfunc _write_lock(rwlock_t *lock)
- {