读者写者问题c语言_信号量解决三种优先级下的读写者问题

本文详细介绍了使用C语言解决读者写者问题的三种优先级策略:读者优先、持有者优先和写者优先。在读者优先的方案中,可能会导致写者饿死;持有者优先则确保了写者在储存区时拥有优先权;写者优先方案允许最多一名读者与写者竞争,提高写者的优先级。

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

情形1:读者优先

特点

  • 多名读者可以同时读
  • 写者写时储存区只有写者一个人
  • 有读者在读时,未进入储存区的读者和写者不公平地竞争,体现在:写者不可能开始写,但读者可以读
  • 只有当储存区没有读者时(但可能有一名写者,也可能空无一人),读者和写者才公平地竞争

伪码

int read_count = 0;
semaphore read_count_lock = 1;
semaphore wsem = 1;
reader(){
    wait(read_count_lock);
    read_count++;
    if(read_count==1) wait(wsem);
    signal(read_count_lock);

    READ_PROCESS();

    wait(read_count_lock);
    read_count--;
    if(read_count==0) signal(wsem);
    signal(read_count_lock);
}
writter(){
    wait(wsem);
    WRITE_PROCESS();
    signal(wsem);
}

解释

  • 多名读者可以同时读体现在READ_PROCESS()前后没有信号量抢锁语句
  • 因为写者需要wait(wsem)才能进入写过程,而只要储存区还有一名读者,wsem就被读者持有,故写者无法进行写
  • 当储存区没有读者时,wsem值为1,读者和写者公平地竞争wsem

代码

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t wsem,read_count_lock;
int read_count;
int memory;
void init(){
    
    
    sem_init(&wsem,0,1);
    sem_init(&read_count_lock,0,1);
    memory = 0;
    read_count = 0;
}


void reader(){
    
    
    while(1){
    
    
    sem_wait(&read_count_lock);
    read_count++;
    if(read_count==1)   sem_wait(&wsem);
    sem_post(&read_count_lock);

    READ_PROCESS();

    sem_wait(&read_count_lock);
    read_count--;
    if(read_count==0)   sem_post(&wsem);
    sem_post(&read_count_lock);
    }
}

void READ_PROCESS(){
    
    
    printf("READ:%dn",memory);
    //sleep(1);
}

void writer(){
    
    
    while(1){
    
    
    sem_wait(&wsem);
    WRITE_PROCESS();
    sem_post(&wsem);
    }
}

void WRITE_PROCESS(){
    
    
    me
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值