读者-写者问题代码(带注释)个人学习笔记

只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行wait(wmutex)操作;若wait(wmutex)操作成功,Reader进程便可去读,相应地,做readcount+1操作。

同理,仅当Reader进程在执行了readcount1操作后其值为0时,才须执行signal(wmutex)操作,以便让Writer进程写。

Readcount是一个可被多个Reader进程访问的临界资源,因此,应该为它设置一个互斥信号量rmutex

--Reader and Writer--

semaphore rmutex=1,wmutex=1; //定义两个信号量
int readcount=0;

void reader()
{
    do{
    wait(rmutex);//由于readcount是一个可被多个Reader进程访问的临界资源,因此设置一个互斥信号量rmutex
    if(readcount==0) wait(wmutex);//如果读者数为0,则此时应该将w互斥量减1
     readcount++;//读者数+1
    signal(rmutex);//释放r互斥量
    ...
     perform read operation;
    ...
    wait(rmutex);//每次访问readcount时都要使互斥信号量rmutex-1
    readcount--;
    if(readcount==0)signal(wmutex);
    signal(rmutex);
    }while(TRUE);
}

void writer()
{
    do{
    wait(wmutex);//若wmutex=1,则-1进入下面的操作;若wmutex=0,原地等待。

    perform write operation;

    signal(wmutex);//释放wmutex
    }while(TRUE)
}

void main()
{
    cobegin//并行开始
      reader();writer();
    coend;//并行结束
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值