标签:读写锁
一.概述:
有一种情况:即对一些公共资源的访问操作很多,但修改操作比较少,而访问操作往往伴随着查找操作,中间耗时很长。此时如果用互斥锁的话,一个线程会在读操作内待的时间比较长,如果是多线程就会降低并发性。而如果用读写锁,其并发性会大大提高(理论上,有多少个cpu就会有多少个线程同时进行读操作),从而提高程序的效率。
读写锁必须维持三种关系:读者之间不能互斥(即没有关系),写者之间要互斥,读者与写者之间要互斥和同步。
读写锁是一种特殊的自旋锁。自旋锁:当条件不成立的时候会一直询问(轮询)直到条件满足。(适合于在锁内待的时间较少(可以减少线程调度))。
读写锁的三种状态:
1.当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞
2.当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是以写模式 对它进行加锁的线程将会被阻塞
3.当读写锁在读模式的锁状态时,如果有另外的线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁的请求,这样可以避免读模式锁长期占用,而等待的写模式锁请求则长期阻塞。
二.相关函数:
(1).pthread_rwlock_init:int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr)
rwlock参数:输出型参数。
attr参数:设置读写锁的状态,一般为NULL。
返回值:成功返回0,失败返回错误码。
(2).pthread_rwlock_destroy:int pthread_rwlock_destroy(pthread_rwlock_t *rwlock)
函数功能:销毁一共读写锁,并释放其资源。
返回值:成功返回0,失败返回错误码。
(3).pthread_rwlock_rdlock函数:int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
函数功能:以读加锁状态进行加锁。(阻塞式的)
返回值:成功返回0,失败返回错误码。
(4).thread_rwlock_tryrdlock函数:int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
函数功能:以读加锁状态进行加锁。(非阻塞式的)
返回值:成功返回0,失败返回错误码。
(5).thread_rwlock_wrlock函数:int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
函数功能:以写加锁状态进行加锁。(阻塞式的)
返回值:成功返回0,失败返回错误码。
(6).thread_rwlock_trywrlock函数:int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
函数功能:以写加锁状态进行加锁。(非阻塞式的)
返回值:成功返回0,失败返回错误码。
(7).thread_rwlock_unlock函数:int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
函数功能:对rwlock进行解锁。
返回值:成功返回0,失败返回错误码。
三.相关代码:
1 #include<stdio.h> 2 #include<pthread.h> 3 4 int g_data = 0; 5 pthread_rwlock_t rw_lock; 6 7 void* writer(void* arg) 8 { 9 while(1) 10 { 11 pthread_rwlock_wrlock(&rw_lock); 12 g_data++; 13 pthread_rwlock_unlock(&rw_lock); 14 sleep(3); //注意要加在锁的外面,过5秒获得写锁,其它时间都是读者 15 } 16 } 17 18 void* reader(void* arg) 19 { 20 21 while(1) 22 { 23 pthread_rwlock_rdlock(&rw_lock); 24 printf("the g_data is: %d\n ",g_data); 25 pthread_rwlock_unlock(&rw_lock); 26 sleep(1); 27 } 28 } 29 30 31 int main() 32 { 33 pthread_rwlock_init(&rw_lock, NULL); 34 pthread_t tid1, tid2; 35 pthread_create(&tid1, NULL, writer, NULL); 36 pthread_create(&tid2, NULL, reader, NULL); 37 pthread_join(tid1, NULL); 38 pthread_join(tid2, NULL); 39 return 0; 40 }
执行结果:
总结:读写锁适用于对一共公共资源的读操作进行多,而写操作进行少的情况。在这种情况下可以提高读操作的并发性,因为读写锁中的对读操作的线程并没有互斥,理论上有多少个cpu就会有多少个线程在并发进行读操作。
本文出自 “水仙花” 博客,请务必保留此出处http://10704527.blog.51cto.com/10694527/1767995
标签:读写锁
原文地址:http://10704527.blog.51cto.com/10694527/1767995