上海手机网站制作,鄂尔多斯建设局网站,北京微网站建设设计服务公司,wordpress 图像主题读写锁#xff1a;
概念#xff1a;读写锁也叫共享-独占锁。当读写锁以读模式锁住时#xff0c;它是以共享模式锁住的#xff1b;当它以写模式锁住时#xff0c;它是以独占模式锁住的。#xff08;写独占#xff0c;读共享#xff09;。
读写锁使用场所#xff1a; …读写锁
概念读写锁也叫共享-独占锁。当读写锁以读模式锁住时它是以共享模式锁住的当它以写模式锁住时它是以独占模式锁住的。写独占读共享。
读写锁使用场所
读写锁非常适合对数据结构读的次数远大于写的情况可以同时读
特性
读写锁是“写模式加锁”时解锁前所有对该锁加锁的线程都会被阻塞
读写锁 是“读模式加锁”时如果线程以读模式对其加锁就会成功如果线程以写模式加锁会阻塞
读写锁是“读模式加锁”时既有试图以写模式加锁的线程也有试图以读模式加锁的线程。那么读写锁会阻塞随后的读模式加锁优先满足写模式加锁。读锁写锁并行阻塞写锁优先级高。
例如
线程A加写锁成功线程B请求读锁
-B锁阻塞等A解锁后B加锁成功
线程A加读锁成功线程B请求写锁
-B锁阻塞等A解锁后B加锁成功
线程A拥有读锁线程B请求B锁
-线程B加锁成功
线程A持有读锁然后线程B请求写锁然后线程C请求读锁
-线程B和C都阻塞
-当A释放锁之后B先获得锁C阻塞
-当B释放锁后C获得锁
线程A持有读锁然后线程B请求读锁然后线程C请求写锁
-线程B获得锁成功线程C要等AB释放锁后才能获得锁
线程A持有写锁然后线程B请求读锁然后线程C请求写锁
-线程B和C都阻塞
-当A释放锁之后C先获得锁B阻塞
-当C释放锁后B获得锁
读写锁相关函数
pthread_rwlock_t函数
函数描述:定义一把锁
pthread_rwlock_init函数
函数描述初始化读写锁
函数原型int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
函数参数rwlock-读写锁 attr-读写锁属性传NULL
pthread_relock_destroy函数
函数描述销毁锁
函数原型int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
pthread_rwlock_rdlock函数
函数描述加读锁
函数原型int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
pthread_rwlock_tryrdlock函数
函数描述尝试加读锁不会阻塞
函数原型int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
pthread_rwlock_wrlock函数
函数描述加写锁
函数原型int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
pthread_rwlock_trywrlock函数
函数描述尝试加写锁不会阻塞
函数原型int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
pthread_rwlock_unlock函数
函数描述解锁
函数原型 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
案例
创建3个线程写共享资源五个线程读共享资源
#includestdio.h
#includestring.h
#includestdlib.h
#includesys/types.h
#includeunistd.h
#includepthread.h
int num1;
//定义一把锁
pthread_rwlock_t rwlock;
void * thread_w(void *arg)
{int n*(int *)arg;int i0;for(;i10;i){pthread_rwlock_wrlock(rwlock);num;printf([%d]write num[%d]\n,n,num);pthread_rwlock_unlock(rwlock);}
}
void *thread_r(void *arg)
{int n*(int *)arg;pthread_rwlock_rdlock(rwlock);printf([%d]read num[%d]\n,n,num);pthread_rwlock_unlock(rwlock);
}
int main()
{pthread_rwlock_init(rwlock,NULL);//初始化锁pthread_t thread[8];int arr[8];int i0;for(;i3;i){arr[i]i;pthread_create(thread[i],NULL,thread_w,arr[i]);}for(;i8;i){arr[i]i;pthread_create(thread[i],NULL,thread_r,arr[i]);}int j0;for(;j8;j){pthread_join(thread[j],NULL);}pthread_rwlock_destroy(rwlock);//销毁锁printf(final num[%d]\n,num);return 0;
}
结果 可以看到五个读线程时可以同时进行的。