概述
读写锁的三二一模型
- 三:三种关系 、读者与读者之间没有关系、写者和读者互斥且同步、写者与写者之间互斥
- 二:两种对象、读者和写者
- 一:一个交易场所
读写锁应用的场景:在多线程程序里面,线程对临界资源的访问比较多,而对临界资源的修改较少。
在读写者模型里面,由于写操作的次数比较少。那么在该模型里面的写操作的优先级必读操作的优先级高。加入读的优先级比写优先级高,那么就会出现读操作在一直读,写操作就会出现饥饿现象。
读写锁
类型:pthread_rwlock_t
初始化和销毁读写锁
#include <pthread.h>
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);
读写锁的加锁和解锁
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
实例:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
pthread_rwlock_t lock;
int count = 0;
void* route_read(void* arg){
int id = (int)arg;
int t = count;
while(1){
usleep(100000);
pthread_rwlock_rdlock(&lock);
printf("tid = %x id = %d t = %d count = %dn",pthread_self(),id,t,count);
pthread_rwlock_unlock(&lock);
sleep(1);
}
}
void* route_write(void* arg){
int id = (int)arg;
int t = count;
while(1){
usleep(100000);
pthread_rwlock_wrlock(&lock);
printf("tid = %x id = %d t = %d ++count = %dn",pthread_self(),id,t,++count);
pthread_rwlock_unlock(&lock);
sleep(1);
}
}
int main(){
pthread_t id[8];
int i = 0;
pthread_rwlock_init(&lock,NULL);
for(;i<3;i++){
pthread_create(&id[i],NULL,route_write,(void*)i);
}
for(i=3;i<8;i++){
pthread_create(&id[i],NULL,route_read,(void*)i);
}
for(i=0;i<8;i++)
pthread_join(id[i],NULL);
return 0;
}
最后
以上就是干净指甲油为你收集整理的【Linux】读写锁!!的全部内容,希望文章能够帮你解决【Linux】读写锁!!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复