文档详情

实验要求提交内容:源程序(必须有注释)、数据文件、运行结果、实验报告.pdf

发布:2018-04-17约9.02千字共7页下载文档
文本预览下载声明
实验要求 提交内容:源程序(必须有注释) 、数据文件、运行结果、实 验报告。 实验报告格式: 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 数
显示全部
相似文档