在并发的方式中有读-读并发、读-写并发和写-写并发三种,很显然,一般的 读操作并不会修改它的值(对某些读清零的硬件寄存器除外),因此读和读 之间是完全允许并发的。但是使用自旋锁,读操作也会被加锁,从而阻止了 另外一组读操作。为了提高并发的效率,必须降低多的粒度,以允许读和读 之间的并发。 为此内核提供了一种允许读和读并发的锁,叫读写锁,其数据类型 为rwlock_t ,常用的API如下:
rwlock_init ( lock)
read_trylock ( lock)
write_trylock ( lock)
read_lock ( lock)
write_lock ( lock)
read_lock_irq ( lock)
read_lock_irqsave ( lock, flags)
read_lock_bh ( lock)
write_lock_irq ( lock)
write_lock_irqsave ( lock, flags)
write_lock_bh ( lock)
read_unlock ( lock)
write_unlock ( lock)
read_unlock_irq ( lock)
read_unlock_irqrestore ( lock, flags)
read_unlock_bh ( lock)
write_unlock_irq ( lock)
write_unlock_irqrestore ( lock, flags)
write_unlock_bh ( lock)
下面是一个实例:
int i = 5 ;
unsigned long flags;
rwlock_t lock;
rwlock_init ( & lock) ;
write_lock_irqsave ( & lock, flags) ;
i++ ;
write_unlock_irqrestore ( & lock, flags) ;
int v;
read_lock_irqsave ( & lock, flags) ;
v = i;
read_unlock_irqrestore ( & lock, flags) ;
读写锁的使用也需经历定义、初始化、加锁、解锁的过程,只是要改变变量 的值需要先获取写锁,值改变完成之后再解除写锁,读操作则用读锁。这样, 当一个内核执行路径在获取变量的值时,如果有另一条执行路径也要来获取变量的值,则读锁可以正常获得,从而另一条路也能正常获取 变量的值。但如果有另外一个写在进行,那不管是写锁还是读锁都不能获得, 只有当写锁释放以后才可以。很明显,使用读写锁降低了锁的粒度,即对锁 的控制更加精细了,从而获得了更高的并发性,带来了更高的工作效率。