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

    一个数据文件或记录可被多个进程共享。

    • 只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程”。
    • 允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象

    “读者--写者问题”是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。
    读、读共享; 写、写互斥; 写、读互斥

    1.利用记录型信号量解决读者--写者问题

    • 互斥信号量wmutex: 实现Reader与Writer进程间在读或写时的互斥,整型变量Readcount: 表示正在读的进程数目;
      由于只要有一个Reader进程在读,便不允许Writer进程写。所以,仅当Readcount=0,即无Reader进程在读时,Reader才需要执行Wait(wmutex)操作。若Wait(wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。
      同理,仅当Reader进程在执行了Readcount减1操作后其值为0时,才需执行signal(wmutex)操作,以便让Write进程写
    • 互斥信号量rmutex: Reader进程间互斥访问Readcount

    总结:
    wmutex:是读写的互斥信号量
    rmutex: 是读进程互斥访问Readcount的信号量

    Wmutex: 读、写互斥;写、写互斥 Rmutex: 读间访问Readcount互斥 Readcount: 记录读者进程数

    Var  wmutex, rmutex :semaphore :=1, 1;
            Readcount :integer :=0;
    begin
        parbegin
            Reader : begin
                 repeat
                    wait(rmutex);
                    if Readcount=0 then wait(wmutex);
                    Readcount :=Readcount +1;
                    signal(rmutex);
                       …
                       读;
                       …
                    wait(rmutex);
                    Readcount :=Readcount -1;
                    if Readcount=0 then signal(wmutex);
                    signal(rmutex);
                until  false;
           end
         parend
    end 
    
    Writer : begin
         repeat
             wait(wmutex);
             写;
             signal(wmutex);
         until  false;
    end 
    
    

    评价:能实现读者—写者问题 但读优先,对写者不公平



    作者:Weastsea
    链接:https://www.jianshu.com/p/e1852e9e15e3
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    userdir 希望用户能够以http://X.X.X.X/~username 方式来访问自己的网页
    var_export() 函数的使用
    mb_detect_encoding — 检测字符的编码
    详解PHP fsockopen的使用方法
    jQuery 返回顶部
    Mysql函数
    sql where 1=1和 0=1 的作用
    Numpy基础学习(三)
    Numpy 中的矩阵
    Numpy数组的全通用函数
  • 原文地址:https://www.cnblogs.com/h694879357/p/14615657.html
Copyright © 2011-2022 走看看