读者写者模型

读者写者模型

  • 锁类型 : 自旋锁,一直占用着CPU,在未获得锁的情况下,会一直自选的等待,如果不能在短时间内获得锁,会使CPU效率很低.
  • 应用场景 :
对于一块公共资源来说,读取的频率比较高,但是写的频率很低.
通常而言,在读的过程中,往往伴随着查找的操作,中间消耗着大量的时长,如果给这种代码加锁,就会极大的降低我们的效率.
所以在读的时候是不需要加锁的,大家共享公共资源,但是不会修改,那么就不存在数据读错的问题.
但是当有人要写这个数据的时候,我们就必须要加锁,为了避免有读者读取到的数据不是当前修改过的数据.读写锁就是为了解决这样的问题的.
  • 一个场景
这里指一块公共资源
  • 两种角色
读者 - 只读取数据,不对数据进行修改
写者 - 会修改数据内容
  • 三种关系
读者 & 读者 -> 共享
写者 & 写者 -> 互斥
读者 & 写者 - > 同步互斥

读写锁接口

初始化
pthread_rwlock_init (pthread_rwlock_t * restrict  rwlock, const pthread_rwlockattr_t * restrict attr);

参数:
    rwlock : 读写锁
    attr : NULL

销毁
int pthread_rwlock_destroy(pthread_rwlock_t* rwlock);

加锁和解锁
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 <unistd.h>
#include <pthread.h>

pthread_rwlock_t rwlock; // 创建一个读写锁

// 1. 一种场景
//    这里使用一全局变量
int count = 0;

// 2. 两种角色
// 3. 三种关系
void* Read(void* arg)
{
    (void)arg;
    while(1)
    {
        pthread_rwlock_rdlock(&rwlock);
        printf("begin read\n");
        printf("read : %d\n",count);
        printf("read done\n");
        pthread_rwlock_unlock(&rwlock);
        usleep(123456);
    }
    return NULL;
}

void* Write(void* arg)
{
    (void)arg;
    while(1)
    {
        pthread_rwlock_rdlock(&rwlock);
        printf("begin write\n");
        printf("write : %d\n",++count);
        printf("write done\n");
        pthread_rwlock_unlock(&rwlock);
        usleep(987654);
    }
    return NULL;
}

int main()
{
    pthread_rwlock_init(&rwlock,NULL);

    pthread_t reader[4], writer[2];
    int i = 0;
    for(i = 0; i < 4; ++i)
    {
        pthread_create(&reader[i],NULL,Read,NULL);
    }
    for(i = 0; i < 2; ++i)
    {
        char buf[32] = {0};
        sprintf(buf,"writer %d",i);
        pthread_create(&writer[i],NULL,Write,NULL);
    }

    for(i = 0; i < 4; ++i)
    {
        if(i < 2)
        {
            pthread_join(writer[i],NULL);
        }
        pthread_join(reader[i],NULL);
    }

    pthread_rwlock_destroy(&rwlock);
    return 0;
}

结果演示:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值