读者-写者问题-第三十二天

目录

问题描述

解决问题 

结论


问题描述

对于②:数据覆盖 

读者-写者问题-第三十二天_第1张图片

解决问题 

1、 关系分析:找出题目中描述的各个进程,分析它们之间的同步、互斥关系

只有互斥关系:写进程与写进程互斥、写进程与读进程互斥、读进程与读进程不互斥

2、整理思路:根据各进程的操作流程确定P、V操作的大致顺序

3、 设置信号量:设置需要的信号量,并根据题目要求确定信号量初值(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值时多少)

semaphore rw = 1;    //用于实现对共享文件的互斥访问
int count = 0;       //记录当前有几个读进程在访问该文件
semaphore mutex = 1; //用于保证对count变量的互斥访问
semaphore w = 1;     //用于实现“写优先”

4、代码实现 

读者-写者问题-第三十二天_第2张图片

当出现以下并发执行的顺序时:

  • 情况一:读者1->读者2
  • 情况二:写者1->写者2
  • 情况三:写者1->读者1
  • 情况四:读者1->写者1->读者2
  • 情况五:写者1->读者1->写者2

结论

1、在这种算法中,连续进入的多个读者可以同时读取文件;写者和其他进程不能同时访问文件;写者不会饥饿,但也并不是真正的“写优先”,而是相对公平的先来先服务原则(故该算法也称“读写公平法”)

2、 该算法为我们解决复杂的互斥问题提供了一个参考思路(其核心思想在于设置了一个计数器count用来记录当前正在访问共享文件的读进程数,我们可以用count的值来判断当前进入的进程是否是第一个/最后一个读进程,从而做出不同的处理,另外,对count变量的检查和赋值不能一气呵成会导致一些错误,因此我们后面也会联想到使用互斥信号量mutex来解决该问题) 

~over~

你可能感兴趣的:(计算机操作系统-初阶,ubuntu,linux,windows,centos,gnu)