C语言使用PV操作实现读者-写者问题

本文通过分析读者写者问题的经典场景,使用信号量和互斥锁实现资源的共享与保护,探讨了如何防止写者饥饿现象,提出了一种改进方案,使写者有更大机会进行资源修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开局一张图

在这里插入图片描述

代码一贴

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


#define P sem_wait
#define V sem_post
#define  writeblock &writeblock_
#define mutex &mutex_

sem_t writeblock_;
sem_t mutex_;


int readcount=0;

void * reader_i()
{
    P(mutex); //表示对进入人数的一个互斥信号量
    readcount++;
    /*由于有了这处的判断,一来可以在读者来的时候写者不能进入阅览室
    二来 就是写者在写的时候,这里P操作就会得到一个负数 这样自身就被阻塞,就完成了写者写的时候读者不能够进阅览室*/
    if(readcount == 1)
        P(writeblock);
    V(mutex);
    printf("读者开始读取书籍\n");
    P(mutex);
    readcount--;
    if(readcount == 0)
        V(writeblock);
    V(mutex);

}
void writer_i()
{
    P(writeblock); 
    printf("写者修改书籍\n");
    V(writeblock);

}



int main()
{
    sem_init( writeblock,0,1); //sem_init  的使用请自行百度
    sem_init(mutex,0,1);

    pthread_t tid1;
    pthread_t tid11;
    pthread_t tid111;
    pthread_t tid22;
    pthread_t tid2;

    pthread_create(&tid2,NULL,writer_i,NULL);
    pthread_create(&tid1,NULL,reader_i,NULL);
    pthread_create(&tid22,NULL,writer_i,NULL);
    pthread_create(&tid11,NULL,reader_i,NULL);
    pthread_create(&tid111,NULL,reader_i,NULL);


    pthread_exit(0);

    return 0;
}

分析上述程序,我们可以得知,当第一个读者来的时候,写者就被阻塞,如果接下来不断有读者来的话,就有可能出现一个极端的情况,就是写者一直在外面等待的现象,也就是饥饿现象。为了尽量避免这种情况,我们应该增加一个信号量来保证写者在等待时候,能有几率获得进去图书馆修改书籍

代码一换

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


#define P sem_wait
#define V sem_post
#define  writeblock &writeblock_
#define mutex &mutex_
#define mutex1 &mutex1_

sem_t writeblock_;
sem_t mutex_;
sem_t mutex1_;


int readcount=0;

void * reader_i()
{
    P(mutex1);
    P(mutex);
    readcount++;
    if(readcount == 1)
        P(writeblock);
    V(mutex);
    V(mutex1);

    printf("读者开始读取书籍\n");
    P(mutex);
    readcount--;
    if(readcount == 0)
        V(writeblock);
    V(mutex);

}
void writer_i()
{
    P(mutex1);
    P(writeblock);
    printf("写者修改书籍\n");
    V(writeblock);
    V(mutex1);

}



int main()
{
    sem_init( writeblock,0,1);
    sem_init(mutex,0,1);
    sem_init(mutex1,0,1);




    pthread_t tid1;
    pthread_t tid11;
    pthread_t tid111;
    pthread_t tid22;
    pthread_t tid2;


    pthread_create(&tid1,NULL,reader_i,NULL);

    pthread_create(&tid11,NULL,reader_i,NULL);
    pthread_create(&tid111,NULL,reader_i,NULL);
    pthread_create(&tid2,NULL,reader_i,NULL);
    pthread_create(&tid22,NULL,writer_i,NULL);




    pthread_exit(0);




    return 0;
}

显然,现在写者是有更大的几率可以进去修改书籍了,不用一直傻傻等待到最后…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值