Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75021
  • 博文数量: 34
  • 博客积分: 82
  • 博客等级: 民兵
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-23 18:51
文章分类
文章存档

2013年(2)

2012年(33)

分类:

2012-10-24 18:32:40

    要求: (1)多个读者可以同时进行读;
    (2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行);
    (3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。

    定义读者与写者两个队列: ReadQ与WriterQ,初始值均为空;
    定义文件状态 FileState变量,0, write与read三个状态,初始值为0。
    若不考虑互斥情况的代码为:
Read()

    ReadQ.push();        //读者入队
    
    if((ReadQ.Length()!=0)&&(FileState!=write)&&(WriteQ.Length()==0))
    {
        FileState=read;
        ReadQ.do();            //队列中全部读者执行读操作,队列清空
        FileState=0;
    }

}    

Writer()
{
    WriterQ.push();        //写者入队    
    
    if((WriterQ.Length()!=0)&&(FileState!=read))
    {
        FileState=write;
        writer=WriterQ.pop();
        writer.do();        //写者执行写操作
        FileState=0;
    }
}
    考虑到互斥的情况,添加变量readcount,初始值为0,并设置信号量mutex。
    对应上面的读者与写者两个队列(ReadQ与WriterQ),文件状态 FileState变量设置三个信号量,依次为mutexReadQ,mutexWriterQ和mutexFileState。
    代码如下:
Read()

    P(mutexWriteQ);
    while(WriteQ.Length()!=0)
        /*忙等待*/;
    V(mutexWriteQ);
    
    P(mutex);
        readcount ++;
        if (readcount==1)
            P(mutexFileState);
    V(mutex);
    Read.do();    //读者执行读操作
    P(mutex);
        readcount --;
        if (readcount==0)
            V(mutexFileState);
    V(mutex);
}        

Writer()
{
    P(mutexWriteQ);
    WriterQ.push();        //写者入队    
    V(mutexWriteQ);
        P(mutexFileState);
            P(mutexWriteQ);
                writer=WriterQ.pop();
            V(mutexWriteQ);
            writer.do();        //写者执行写操作
        V(mutexFileState);    
    V(mutexWriteQ);
}
阅读(1588) | 评论(0) | 转发(0) |
0

上一篇:读者写者问题

下一篇:哲学家进餐问题

给主人留下些什么吧!~~