首页 理论教育 Linux驱动程序开发实例:读写锁实现方法

Linux驱动程序开发实例:读写锁实现方法

时间:2023-10-19 理论教育 版权反馈
【摘要】:读写锁实际是一种特殊的自旋锁。在实际应用中如果需要对某个数据的读操作和写操作进行有区别的加锁时,可以使用读写锁。读写锁相对于普通自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源。在读写锁保持期间也是抢占失效的。如果读写锁没有写者,那么读者可以立即获得该读写锁,否则读者必须自旋,直到写者释放该读写锁。初始化读写锁的方法有两种,一种是动态初始化,一种是静态初始化。

Linux驱动程序开发实例:读写锁实现方法

读写锁(rwlock)实际是一种特殊的自旋锁。在实际应用中如果需要对某个数据的读操作和写操作进行有区别的加锁时,可以使用读写锁。读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。

读写锁相对于普通自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源。写者是排他性的,一个读写锁同时只能有一个写者或多个读者,但不能同时既有读者又有写者。在读写锁保持期间也是抢占失效的。如果读写锁当前没有读者也没有写者,那么写者可以立刻获得读写锁,否则它必须自旋,直到没有任何写者或读者。如果读写锁没有写者,那么读者可以立即获得该读写锁,否则读者必须自旋,直到写者释放该读写锁。在ARM平台上,内核用32bit的数据来记录读写锁中读写线程的数量,最高位为写者的数量,只允许一个;0~30bit记录读者的数量(具体见内核arch_read_lock与arch_write_lock代码)。

读写锁的类型是rwlock_t。初始化读写锁的方法有两种,一种是动态初始化,一种是静态初始化。

rwlock_t x;

rwlock_init(x);//动态初始化读写锁x

rwlock_t x=RW_LOCK_UNLOCKED//静态初始化

读锁最基本的函数组合如下:

//获得读锁。如果不能获得锁,它将自旋,直到获得该读锁

read_lock(lock);

//释放读锁

read_unlock(lock);(www.xing528.com)

写锁最基本的函数组合如下:

//获得写锁,如果不能获得锁,它将自旋,直到获得该写锁

write_lock(lock);

//释放读写锁

write_unlock(lock);

与自旋锁一样,读写锁中分别为读写提供了尝试获取锁,这两个函数立即返回,成功获得锁返回真,否则返回假:

read_trylock(lock);

write_trylock(lock);

使用读写锁的示例代码如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈