读者与写者问题

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

  • 只要求读文件的进程称为“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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @   Tomorrow1126  阅读(363)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示