2.19、读者-写者问题

文章探讨了读者写者问题,其中多个读进程可同时读取文件而不影响数据,但写进程需独占资源。关键在于使用互斥信号量rw进行加锁和解锁控制,并通过计数器count跟踪读进程数量,确保读写互斥。为防止写进程饿死,读进程具有优先权。文章强调了PV操作在解决并发控制中的作用,并提示可将此问题的解决思路应用于更复杂的资源管理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,

  • 但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。

因此要求:

  • ①允许多个读者可以同时对文件执行读操作;
  • ②只允许一个写者往文件中写信息;
  • ③任一写者在完成写操作之前不允许其他读者或写者工作;
  • ④写者执行写操作前,应让已有的读者和写者全部退出。

image-20230203211117170

1、问题分析

两类进程:写进程、读进程

互斥关系:写进程一写进程、写进程一读进程。读进程与读进程不存在互斥问题。

写者进程和任何进程都互斥,设置一个互斥信号量 rw,在写者访问共享文件前后分别执行 PV 操作。

读者进程和写者进程也要互斥,因此读者访问共享文件前后也要对 rw 执行 PV 操作。

如果所有读者进程在访问共享文件之前都执行 P(rw) 操作,那么会导致各个读进程之间也无法同时访问文件。


Key:读者写者问题的核心思想――怎么处理该问题呢?

P(rw)V(rw) 其实就是对共享文件的“加锁”和“解锁”。既然各个读进程需要同时访问,而读进程与写进程又必须互斥访问,那么我们可以让第一个访问文件的读进程“加锁”,让最后一个访问完文件的读进程“解锁”。

可以设置一个整数变量 count 来记录当前有几个读进程在访问文件。

2、具体实现

image-20230203212211954

潜在的问题:只要有读进程还在读,写进程就要一直阻塞等待,可能“饿死”。

  • 因此,这种算法中,读进程是优先的

image-20230203233530865

3、总结

读者-写者问题为我们解决复杂的互斥问题提供了一个参考思路。

核心思想在于设置了一个计数器 count 用来记录当前正在访问共享文件的读进程数。我们可以用 count 的值来判断当前进入的进程是否是第一个/最后一个读进程,从而做出不同的处理。

另外,对 count 变量的检查和赋值不能一气呵成导致了一些错误,

  • 如果需要实现一气呵成,自然应该想到用互斥信号量 \color{red}如果需要实现一气呵成,自然应该想到用互斥信号量 如果需要实现一气呵成,自然应该想到用互斥信号量

最后,还要认真体会我们是如何解决“写进程饥饿”问题的。

绝大多数的考研 PV 操作大题都可以用之前介绍的几种生产者-消费者问题的思想来解决,如果遇到更复杂的问题,可以想想能否用读者写者问题的这几个思想来解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值