zoukankan      html  css  js  c++  java
  • 读者写者问题

    读者优先:

    • 读者进程执行:
      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) ;
        }
    }
  • 相关阅读:
    递归--练习5--noi1751分解因数
    递归--练习4--noi666放苹果
    递归--练习3--noi7592求最大公约数问题
    递归--练习2--noi6261汉诺塔
    递归--练习1--noi3089爬楼梯
    JavaScript--语法4--函数1
    JavaScript--语法3--数组
    JavaScript--练习1--99乘法表
    应用排行榜第一名脸萌仅仅是刹那的烟火
    Readprocessmemory使用方法
  • 原文地址:https://www.cnblogs.com/iamzhoug37/p/5400505.html
Copyright © 2011-2022 走看看