读写锁
2016-04-24 21:05
239 查看
读写锁与互斥量类似,不过读写锁允许更高的并行性。互斥量要么是锁住状态,要么就是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁可以有三种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是锁哥线程可以同时占有读模式的读写锁。当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。当读写锁在读加锁状态时,所有试图以读模式对他进行加锁的线程都可以得到访问权限,但是任何希望以写模式对此锁进行加锁的线程都会被阻塞,直到所有的线程释放他们的读锁为止。当读写锁处于读模式锁住的状态,而这时有一个线程试图以写模式获取锁时,读写锁通常会阻塞随后的读模式锁请求。这样可以避免读模式锁长期占用,而等待的写模式锁请求一直得不到满足。读写锁非常适合于对数据结构读的次数远大于写的情况。当读写锁在写模式下,它所保护的数据结构就可以被安全的修改。因为一次只有一个线程可以在写模式下拥有这个锁。当读写锁在读模式下时,只要线程先获取了读模式下的读写锁,该锁所保护的数据结构就可以被多个获得读模式锁的线程读取。读写锁也叫作共享互斥锁,当读写锁是读模式锁住时,就可以说成是以共享模式锁住的。当它是写模式锁住的时候,就可以说成是以互斥模式锁住的。读写锁在使用之前必须初始化,在使用完后必须销毁,函数如下:int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr)int pthread_rwlock_destroy(pthread_rwlock_t *rwlock)要在读模式下锁定读写锁,需要调用pthread_rwlock_rdlock,要在写模式下锁定读写锁,需要调用pthred_rwlock_wrlock,都需要调用pthread_rwlock_unlock来进行解锁。函数如下:int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)下面我们来写一个小程序来练练手:在下面的程序中,我们定义了一个全局变量,写着不断地对它进行累加,而读者不断读取它。#include <stdio.h>#include <stdlib.h>#include <pthread.h>pthread_rwlock_t lock;int g_val=0;void *reader(void *arg){while(1){pthread_rwlock_rdlock(&lock);printf("%d\n",g_val);pthread_rwlock_unlock(&lock);}}void *writer(void *arg){while(1){pthread_rwlock_wrlock(&lock);g_val++;pthread_rwlock_unlock(&lock);sleep(1);}}int main(){pthread_rwlock_init(&lock,NULL);pthread_t tid1,tid2;pthread_create(&tid1,NULL,reader,NULL);pthread_create(&tid2,NULL,writer,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_rwlock_destroy(&lock);return 0;}运行结果如下:(结果显示不全)结果是从1到逐渐增大不停地打印,我只截取了一部分。
相关文章推荐
- FileShare枚举的使用小结(文件读写锁)
- 举例说明Java多线程编程中读写锁的使用
- Java多线程编程之读写锁ReadWriteLock用法实例
- Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁
- GO语言并发编程之互斥锁、读写锁详解
- 多线程编程之自旋锁,读写锁
- 前期开发心得总结
- 使用python实现可重入的公平读写锁
- java 基于读写锁的缓存系统演示
- Thread详解15:ReentrantReadWriteLock
- APUE:线程:读写锁rwlock
- ReentrantReadWriteLock源码分析
- java多线程-使用ReadWriteLock同步数据访问
- Java线程并发控制
- 一个简单的读写锁(Windows 平台)
- iOS中的锁
- 线程间的通信与同步
- 读写锁实现模拟缓存池
- 【C/C++多线程编程之九】pthread读写锁
- linux 中多线程使用