浅析读者写者模型

读、写者模型

读、写者模型与生产者消费者模型类似,但是也有不同的地方,多个读者可以共享一块空间中的数据,写者之间是相互斥的,读者和读者是共享的,读者和写者之间是互斥和同步的。
读写锁:也称自旋锁,一个读写锁允许有多个读者进行资源的读取,但是只能够允许一个写者对数据进行操作。(当线程申请资源失败时,由操作系统控制一直轮询检测锁的状态)

与生产者消费者模型的区别
★读写锁也遵循生产者消费者模型中的321原则,但是与消费者和消费者之间的互斥关系不同的是 读者和读者之间时共享的,也就是说同时可以有多个读者去访问临界资源。

★区别去生产者消费者模型,消费者需要取走数据,而读者只需要看到数据

★生产者消费者是同步进行的,但是读者可能多次去读

♥创建使用销毁读写锁
创建与销毁读写锁:

//创建读写锁
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr)

//销毁读写锁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

读者加锁

//阻塞
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

//非阻塞,成功返回0失败返回错误码
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

写者加锁

//阻塞
int  pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

//非阻塞
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

解锁

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

♥实现读者写者模型

#include <stdio.h>
#include <pthread.h>

int book = 0;
pthread_rwlock_t rwlock;

void *write(void *arg)
{

    while(1)
    {
        if(pthread_rwlock_trywrlock(&rwlock)!=0)
        {
            printf("reader is reading...\n");
        }
        else
        {

            printf("wrtie done...%d\n",book++);
            sleep(3);
            pthread_rwlock_unlock(&rwlock);
        }
    }
}

void *read(void *arg)
{
    sleep(1);
    while(1)
    {
        if(pthread_rwlock_tryrdlock(&rwlock)!=0)
        {
            printf("writer is writing...\n");
            sleep(1);
        }
        else
        {
            printf("read done...%d\n",book);

            pthread_rwlock_unlock(&rwlock);
        }
    }
}

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

    pthread_t r,w;

    pthread_create(&r,NULL,read,NULL);
    pthread_create(&w,NULL,write,NULL);

    pthread_join(r,NULL);
    pthread_join(w,NULL);

    pthread_rwlock_destroy(&rwlock);
    return 0;
}

这里写图片描述
读者写着优先级

读者优先:只要有读者要读,写者就不能写,如果前面的读者还没走就来了新的读者,那么新的读者又会读,所以写者可能饿死。
写者优先:写者一到就开始写,即使这时还有读者没读完。当写者写完后,以前的读者需要重新读。
读写公平:之前的读者读完后,写者开始写;写者写完后,后面的读者才开始读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值