实验要求提交内容:源程序(必须有注释)、数据文件、运行结果、实验报告.pdf
文本预览下载声明
实验要求
提交内容:源程序(必须有注释) 、数据文件、运行结果、实
验报告。
实验报告格式:
l 实验目的
l 实验设计
l 程序中使用的数据结构及符号说明
l 程序流程图
l 数据文件说明
l 运行结果说明
编程环境:Windows2000/XP ,VC++6.0 或.net
实验1:读者写者问题
实验内容
在Windows 2000/XP 环境下,创建一个控制台程序,包含n 个线程,表示n 个读者或写者,
每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实
现读者优先和写者优先的的读者-写者问题。
读者写者问题的读写操作限制(包括读者优先和写者优先):
1)写-写互斥,即不能有两个写者同时进行写操作。
2 )读-写互斥,即不能同时有一个线程在读,而另一个线程在写。
3 )读-读允许,即可以有一个或多个读者在读。
读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则
该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资
源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操
作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。
测试数据文件格式
测试数据文件包含n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作
的开始时间和持续时间。每行测试数据包含4 个字段,各个字段间用空格分隔。第一个字段
为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者,W 表示写者。
第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)
后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的延续时间。当线程读
写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。
下面是一个测试数据文件的例子:
1 R 3 5
2 W 4 5
3 R 5 2
4 R 6 5
5 W 5.1 3
线程基本知识
进程是由两个部分构成的,一个是进程内核对象,另一个是地址空间。同样,线程也是由两
个部分组成的:
• 一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线
程统计信息的地方。
• 另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。
进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。每个进程至少需要一个线
程。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。这意味着线程
在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。因此,如果在
单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空间。这些
线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为
句柄表依赖于每个进程而不是每个线程存在。
进程使用的系统资源比线程多得多,原因是它需要更多的地址空间。为进程创建一个虚拟地
址空间需要许多系统资源。系统中要保留大量的记录,这要占用大量的内存。而线程使用的
系统资源要少得多。实际上,线程只有一个内核对象和一个堆栈,保留的记录很少,因此需
要很少的内存。
相关API 函数说明
1.CreateThread
功能:创建一个在调用进程的地址空间中执行的线程。
原型:HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T
dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD
dwCreationFlags, LPDWORD lpThreadId );
参数:本实验中第一个参数用NULL ,第二个参数用0 即可。第三个参数为一个函数指针,
该线程执行此函数,这个函数需要的参数由第四个参数传递。第五个参数为0 。第六个参数
指向一个32 位值,它接收该线程的标识符。
返回值:若函数调用成功,返回值为新线程的句柄;若函数调用失败,返回值为NULL 。
2.Sleep
功能:该函数对于指定的时间间隔挂起当前的执行线程。
原型:void Sleep( DWORD dwMilliseconds );
参数:dwMilliseconds 数
显示全部