码迷,mamicode.com
首页 > 其他好文 > 详细

读者写者问题

时间:2016-04-17 11:30:20      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

读者优先:

  • 读者进程执行:
    1. 无其他读者写者, 直接执行
    2. 有写者等, 但其他读者在读, 直接读
    3. 有写者写, 等待
  • 写者进程执行:
    1. 无其他读写者, 直接执行
    2. 有其他读写者, 等待

伪代码描述:

//R: 信号量, 初值为1 , 用于同步读者之间
//mutx: 信号量, 初值为1, 用于互斥读者与写者, 或者写者与写者
//rc: 用于统计当前有多少读者进程
void
reader() { while (TRUE) { P(R); rc = rc + 1; if (rc == 1) P(mutex); V(R); 读操作 P(R); rc = rc - 1; if (rc == 0) V(mutex); V(R); 其他操作 } } void writer() { while (TRUE) { P(mutex); 写操作 V(mutex); } }

写者优先(这个是我自己想出来的, 不是标准答案, 望指出错误):

  • 读者进程执行:
    1. 如果此时没有写者等待, 直接执行
    2. 如果有写者等待, 那么等待
  • 写者进程执行:
    1. 如果没有其他写者, 那么执行
    2. 如果有其他读写者, 那么等待

伪代码描述:

//mutex 信号量: 初值为1, 控制对临界区的访问
//W 信号量: 初值为1 , 用于写者之间同步 
//R 信号量: 初值为1 , 用于读者之间同步
//RW 信号量: 初值为1, 用于读者与写者之间同步
//rcount 初值为0 : 用于统计当前有多少读者
//wcount 初值为0 : 用于统计当前有多少写者
void reader()
{
    while(true)
    {
        P(RW) ;
            P(R) ;
                rcount++ ;
                if(rcount == 1)
                    P(mutex) ;
            V(R) ;
        V(RW) ;
            读操作
        P(R) ;
            rcount-- ;
            if(rcount == 0)
                V(mutex) ;
        V(R) ;
    }
}

void writer()
{
    while(true)
    {
        P(W) ;
            wcount++ ;
            if(wcount == 1)
                P(RW) ;
        V(W) ;
        P(mutex)
            写操作
        V(mutex)
        P(W) ;
            wcount-- ;
            if(wcount == 0)
                V(RW) ;
        V(W) ;
    }
}

 

读者写者问题

标签:

原文地址:http://www.cnblogs.com/iamzhoug37/p/5400505.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!