本文是操作系统进程同步互斥关于读者写者(生产者消费者)的基本实验。

一、需求

本课程实验内容引自《Windows 内核实验教程》(陈向群、林斌等编著,机械工业出版社,2002.9)。

在Windows 环境下,创建一个包含n 个线程的控制进程。用这n 个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。

读者-写者问题的读写操作限制:

  • 写-写互斥
  • 读-写互斥
  • 读-读允许

读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。

写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。

运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。

二、运行环境

电脑硬件配置:

  • 处理器:Intel i7 7700HQ

  • 显卡:NVIDIA GeForce GTX 1050 Ti

  • 内存:16GB

软件:

  • 编程语言:C++

  • IDE:Microsoft Visual Studio 2019

  • Windows SDK版本:10.0

  • 平台工具集:Visual Studio 2019(v142)

三、核心算法

读者优先:

点击查看代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//信号量:
mutex=1;//对read_count的互斥操作
RP_Write=1;//保证读者优先,读者与写者互斥
//读者:
wait(mutex);
read_count++;
if(read_count==1)
wait(&RP_Write);
signal(mutex);
读临界区……
wait(mutex);
read_count--;
if(read_count==0)
signal(&RP_Write);
signal(mutex);
//写者:
wait(&RP_Write);
写临界区……
signal(&RP_Write);

写者优先:

点击查看代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//信号量:
mutex1=1;//保证每个读者按顺序依次进入临界区
mutex2=1;//对read_count的互斥操作
mutex3=1;//对write_count的互斥操作
cs_Read =1;//保证写者优先,读者与写者互斥
cs_Write=1;//保证如果有读者正在读,写者等待当前读者读完后再写
//读者:
wait(mutex1);
wait(&cs_Read);
wait(mutex2);
read_count++;
if(read_count==1)
wait(&cs_Write);
signal(mutex2);
signal(&cs_Read);
signal(mutex1);
读临界区……
wait(mutex2);
read_count--;
if(read_count==0)
signal(&cs_Write);
signal(mutex2);
//写者:
wait(mutex3);
write_count++;
if(write_count==1)
wait(&cs_Read);
signal(mutex3);
wait(&cs_Write);
写临界区……
signal(&cs_Write);
wait(mutex3);
write_count--;
if(write_count==0)
signal(&cs_Read);
signal(mutex3);

输入:

  1. 屏幕输入:
    • 1:选择读者优先,调用ReaderPriority(“thread.dat”)函数;
    • 2:选择写者优先,调用WriterPriority(“thread.dat”)函数;
    • 3:退出。
  2. 从thread.dat文件读入读者写者线程信息。

    输出:

    屏幕输出各读者写者线程信息。

五、测试样例:

  1. 输入1

    可以看出,写者进程4、2、6虽然都请求了写操作,但是却是等待所有的读者1、3、5读完了再按顺序进行的写入操作,符合读者优先的要求。

  2. 输入2

    可以看出,除了第一个读者进程1在读文件外,虽然读者3、5都请求了读操作,但由于写者进程4、2、6请求了写操作,因为写者优先,所以读者3、5都要等待写者4、2、6写入完成才能读,而写者4、2、6必须等待读者进程1读操作完成后才能写。读者1读操作完成后,写者4、2、6按顺序写入文件,写入完成后,读者3、5同时读文件,符合写者优先的要求。

  3. 输入3

    释放线程,程序退出。

六、项目地址

本项目的源码、可执行程序均已经存放于我的Github,欢迎下载查看:

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

载入天数...载入时分秒...