【Linux】读写锁!!

读写锁的三二一模型

  • 三:三种关系 、读者与读者之间没有关系、写者和读者互斥且同步、写者与写者之间互斥
  • 二:两种对象、读者和写者
  • 一:一个交易场所
    读写锁应用的场景:在多线程程序里面,线程对临界资源的访问比较多,而对临界资源的修改较少。

在读写者模型里面,由于写操作的次数比较少。那么在该模型里面的写操作的优先级必读操作的优先级高。加入读的优先级比写优先级高,那么就会出现读操作在一直读,写操作就会出现饥饿现象。


读写锁
类型: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 = %d\n",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 = %d\n",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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值