读者-写者问题3-写者优先

//写者优先 
int wcount = 0;  //用于记录写者数量 
int rcount = 0;   //用于记录读者数量
semaphore rmutex = 1;   //用于读者进程互斥修改rcount
semaphore wmutex = 1;   //用于写者进程互斥修改wcount
semaphore file = 1;    //用于读者写者互斥访问file 
semphore  read = 1;     //用于阻塞读者进程,实现写者优先 

writer()
{
    P(wmutex);
    if(wcount == 0)
        P(read);
    wcount++;
    V(wmutex);    
    
    P(file);     //写者互斥访问文件 
    do_writing();
    V(file);
    
    P(wmutex)
    wcount--;
    if(wcount == 0)
        V(read);
    V(wmutex);

reader()
{
    P(read);     //检查写者队列是否为空。 
    P(rmutex);
    if(rcount == 0)
        P(file);   //申请文件资源 
    rcount++;
    V(rmutex);
    V(read); 
    
    do_reading();
    
    P(rmutex);
    rcount--;
    if(rcount == 0)
        V(file);
    V(rmutex);    
}

/*注意这里read的作用,开始有多个读者到来开始读file,它们全部进入读者队列,此时来了一个写者,执行了P(read)之后,后续到了的读者由于阻塞在read上,都不能再进入读者队列,而写者到来,则可以全部进入写者队列,因此保证了
写者优先,同时第一个写者读者执行了P(read)之后,也不能马上开始写,必须等到所有进入读者队列的读者都执行完
读操作(由于此时后续到来的读者阻塞在read上,因此读者队列数目会逐渐减少到0),通过V(file)通知写者可以
开始写操作 
*/ 

  • 21
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
读者-写者问题是一个经典的同步问题,它涉及到多个进程(或线程)同时访问共享资源(如文件、数据库等)的情况。其中,读者可以同时读取共享资源,而写者只能独占地写入共享资源。为了保证数据的一致性和正确性,需要对读者-写者的访问进行协调和控制。 记录型信号量是一种特殊的信号量,它可以记录当前被阻塞的进程的信息,从而实现更加精细的同步和控制。在解决读者-写者问题时,可以利用记录型信号量来实现读者优先写者优先的访问。 具体实现方法如下: 1. 定义两个计数器 read_count 和 write_count,分别记录当前正在读取和写入的进程数。 2. 定义一个互斥信号量 mutex,用于保证对共享资源的互斥访问。 3. 定义一个记录型信号量 rw_mutex,用于记录当前正在读取或写入的进程信息。 4. 当有读者进程要读取共享资源时,先对 rw_mutex 进行 P 操作,记录当前正在读取的进程信息,然后对 rw_mutex 进行 V 操作释放信号量。接着对 mutex 进行 P 操作,保证对共享资源的互斥访问。最后执行读取操作,并将 read_count 加 1。当读取完成后,将 read_count 减 1,如果 read_count 变为 0,则对 mutex 进行 V 操作,释放共享资源的访问权。 5. 当有写者进程要写入共享资源时,先对 rw_mutex 进行 P 操作,记录当前正在写入的进程信息,然后对 rw_mutex 进行 V 操作释放信号量。接着对 mutex 进行 P 操作,保证对共享资源的互斥访问。最后执行写入操作,并将 write_count 加 1。当写入完成后,将 write_count 减 1,并对 mutex 进行 V 操作,释放共享资源的访问权。 通过利用记录型信号量,可以实现读者-写者问题的协调和控制,从而保证数据的一致性和正确性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值