欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    操作系统学习课程设计方案 .docx

    • 资源ID:13063122       资源大小:73.27KB        全文页数:24页
    • 资源格式: DOCX        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统学习课程设计方案 .docx

    精品名师归纳总结一、实习要求操作系统课程设计读者写者问题可编辑资料 - - - 欢迎下载精品名师归纳总结在 windows 2000 环境下,创建一个掌握台进程,此进程包含n 个线程。用这n 个线程来表示 n 个读者或写者。每个线程按相应测试数据文件后面有介绍 的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者写者问题。读者写者问题的读写操作限制包括读者优先和写者优先: 1写写互斥,即不能有两个写者同时进行写操作。2) 读写互斥,即不能同时有一个线程在读,而另一个线程在写。3) 读读答应,即可以有一个或多个读者在读。读者优先的附加限制:假如一个读者申请进行读操作时已有另一个读者正在进行读操作,就该读者可直接开头读操作。写者优先的附加限制:假如一个读者申请进行读操作时已有另一写者在等待拜访共享资源,就该读者必需等到没有写者处于等待状态后才能开头读操作。运行结果显示要求:要求在每个线程创建、发出读写操作申请、开头读写操作和终止读写操作时分别显示一行提示信息,以确定全部处理都遵守相应的读写操作限制。二、测试数据文件格式测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者仍是写者,以及读写操作的开头时间和连续时间。每行测试数据包括四个字段,各个字段间用空格分隔。第字段为个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者, W 表示写者。第三字段为一个正数,表示读写操作的开头时间:线程创建后,推迟相应时间单位为秒 后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的连续时间。当线程读写申请胜利后,开头对共享资源的读写操作,该操作连续相应时间后终止,并释放共享资源。下面是个测试数据文件的例子:1 R 3 52 W 4 53 R 5 24 R 6 55 W 5.1 3留意 在创建数据文件时,由于涉及到文件格式问题,最好在记事本中手工逐个键入数据,而不要拷贝粘贴数据,否就,本示例程序运行时可能会显现不行预知的错误。三、实习分析可以将全部读者和全部写者分别存于一个读者等待队列和一个写者等待队列中,每当读答应时,就从读者队列中释放一个或多个读者线程进行读操作。每当写答应时,就从写者队列中释放一个写者进行写操作。1. 读者优先读者优先指的是除非有写者在写文件,否就读者不需要等待。所以可以用个整型变量readcount 记录当前的读者数目,用于确定是否需要释放正在等待的写者线程当 readcount=0 时,说明全部的读者读完,需要释放写者等待队列中的一个写者。每一个读者开头读文件时,必需修改readcount 变量。因此需要一个互斥对象mutex 来实现对全局变量readcount 修改时的互斥。另外,为了实现写写互斥,需要增加一个临界区对象RP_Write 。当写者发出写恳求时,必需申请临界区对象的全部权。通过这种方法,也可以实现读写互斥、当readcount=1 时即第一个读者到来时 ,读者线程也必需申请临界区对象的全部权。当读者拥有临界区的全部权时,写者堵塞在临界区对象 RP_Write 上。当写者拥有临界区的全部权时,第一个读者判定完“ readcount= =1”后堵塞在 write 上,其余的读者由于等待对 readcount 的判定,堵塞在 mutex 上。可编辑资料 - - - 欢迎下载精品名师归纳总结2. 写者优先(请依据自己编写的写者优先程序进行分析) 四、相关 API 函数说明1.CreateThread函数功能:该函数创建一个在调用进程的的址空间中执行的线程。函数原型:HANDLE CreateThread LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId。参数:· lpThreadAttributes : 指向一个 LPSECURITY_A TTRIBUTES结构。该结构打算了返回的句柄是否可被子进程继承。如 lpThreadAttributes 为 NULL ,就句柄不能被继承。在 Windows NT 中该结构的 lpSecurityDescriptor成员定义了新进程的安全性描述符。如lpThreadAttributes为 NULL 。就线程获得个默认的安全性描述符。· dwStackSize: 定义原始堆栈提交时的大小按字节计 。系统将该值舍入为最近的页。如该值为0,或小于默认时提交的大小,默认情形是使用与调用线程同样的大小更多的信息,请看Thread Stack Size。· lpStartAddress: 指向一个 LPTHREAD_START_ROUTINE类型的应用定义的函数,该线程执行此函数。该指针仍表示远程进程中线程的起始的址。该函数必需存在于远程进程中。· lpParameter : 定义一个传递给该进程的32 位值。· dwCreationFlags : 定义掌握进程创建的附加标志。如定义了CREATE_SUSPENDED标志,线程创建时处于挂起状态,并且直到ResumeThread 函数调用时才能运行。如该值为0,就该线程在创建后立刻执行。· lpThreadId :指向个 32 位值,它接收该线程的标识符。返回值:如函数调用胜利,返回值为新线程的句柄。如函数调用失败,返回值为NULL 。备注:新进程的句柄创建时设为THREAD_ALL_ACCESS拜访权限。如未供应安全性描述符,就该句柄可被任何要求一个线程对象句柄的函数所使用。如供应了安全性描述符,就以后使用该句柄时,将在授权拜访以前执行拜访检查。如拜访检查拒绝拜访,就恳求进程不能使用该句柄获得对该线程的拜访。线程从 lpStartAddress 参数定义的函数处开头执行。如该函数返回,系统将默认的认为以调用ExitThread 函数的方法终止该线程。使用GetExitcodeThread 函数来获得线程的返回值。线程创建时拥有 THREAD_PRIORITY_NORMAL优先权。使用GetThreadPriority 和 SetThreadPriority 函数可以获得和设置线程的优先权值。一个线程终止时。该线程对象被设为发信号状态,以满意在该对象上等待的全部进程。一个线程对象始终存在于系统中,直到该线程终止,且它全部的句柄都已通过调用CloseHandle 函数关闭。2.ExitThread函数功能:该函数终止一个线程。函数原型:VOID ExitThread( DWORD dwExitCode)。 参数:· dwExitCode : 定义调用线程的退出代码。使用GetExitCodeThread 函数来检测一个线程的退出代码。返回值: 无。备注:调用 ExitThread 函数,是终止个线程的较好的方法。调用该函数后或者直接的调用,或者从一个线程过可编辑资料 - - - 欢迎下载精品名师归纳总结程返回 ,当前线程的堆栈取消安排,线程终止。如调用该函数时,该线程为进程的最终一个线程,就该线程的进程也被终止。线程对象的状态变为发信号状态,以释放全部正在等待该线程终止的其他线程。线程的终止状态从STILL_ACTIVATE 变为 dwExitCode 参数的值。线程终止时不必从操作系统中移去该线程对象。当线程的最终一个句柄关闭时,该线程对象被删除。3.Sleep函数功能:该函数对于指定的时间间隔挂起当能的执行线程。函数原型:VOID Sleep DWORD dwMulliseconds。 参数:· dwMilliseconds: 定义挂起执行线程的时间,以毫秒ms 为单位。取值为 0 时,该线程将余下的时间片交给处于就绪状态的同一优先级的其他线程。如没有处于就绪状态的同一优先级的其他线程,就函数立刻返回,该线程连续执行。如取值为INFINITE就造成无限推迟。返回值:该函数没有返回值。备注:一个线程可以在调用该函数时将睡眠时间设为0ms,以将剩余的时间片交出。4.CreateMutex函数功能:该函数创建出名或者无名的互斥对象。函数原型:HANDLE CreateMutex LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner, LPCTSTR lpName。参数:· lpMutexAttributes : 指向 SECURITY_ATTRIBUTES结构的指针,该结构打算子进程是否能继承返回句柄。假如 lpMutexAttributes为 NULL ,那么句柄不能被继承。在 Windows NT 中该结构的 LpSecuriyDescriptor 成员指定新互斥对象的安全描述符。假如lpMutexAttributes为 NULL ,那么互斥对象获得默认的安全描述符。· bInitialOwner : 指定互斥对象的初始所属身份。假如该值为TRUE ,并且调用者创建互斥对象,那么调用线程获得互斥对象所属身份。否就,调用线程不能获得互斥对象所属身份。判定调用者是否创建互斥对象清参阅返回值部分。· lpName: 指向以 NULL结尾的字符串,该字符串指定了互斥对象名。该名字的长度小于MAX_PATH且可以包含除反斜线 路径分隔符以外的任何字符。名字是区分大小写的。假如 lpName 与已存在的出名互斥对象名相匹配,那么该函数要求用MUTEX_ALL_ACCESS权限拜访已存在的对象。在这种情形下,由于参数bInitialOwner 已被创建进程所设置,该参数被忽视。假如参数lpMutexAttributes不为 NULL ,它打算句柄是否解除继承,但是其安全描述符成员被忽视。假如 lpName 为 NULL ,那么创建的互斥对象无名。假如 lpName 与已存在的大事、信号量、可等待定时器、作业或者义件映射对象的名字相匹配,那么函数调用失败,并且 GetLastError 函数返回 ERROR_ALREADY_HANDLE,其缘由是这些对象共享相同的名字空间。返回值:假如函数调用胜利,返回值是互斥对象句柄。假如函数调用之前,出名互斥对象已存在,那么函数给已存在的对象返回一个句柄,并且函数GetLastError 返回 ERROR_ ALREADY_EXISTS。否就,调用者创建互斥对象。假如函数调用失败,就返回值为NULL 。如想获得更多错误信息,请调用GetLastError 函数。备注:可编辑资料 - - - 欢迎下载精品名师归纳总结由函数 CreateMutex 返回的句柄有 MUTEX_ALL_ACCESS权限可以去拜访新的互斥对象,并且可用在恳求互斥对象句柄的任何函数中。调用进程中的任何线程可以在调用等待函数时指定互斥对象句柄。当指定对象的状态为信号态时。返回单对象等待函数。当任何一个或者全部的互斥对象都为信号态时,返回多对象等待函数指令。等待函数返回后, 等待的线程被释放,连续向下执行。当一个互斥对象不被任何线程拥有时,处于信号态。创建该对象的线程可以使用bInitialOwner标志来恳求立刻获得对该互斥对象的全部权。否就,线程必需使用等待函数来恳求全部权。当互斥对象处于信号态,等待的线程获得对该对象的全部权时,此互斥对象的状态被设置为非信号态,等待函数返回。任意时刻,仅有一个线程能拥有该互斥对象线程可以使用 ReleaseMutex 函数来释放对这个互斥对象的全部权。总线程已经拥有了个互斥对象,那么它可以重复调用等待函数而不会发生堵塞,一般情形下,用户不会重复等待同一个互斥对象,这种机制防止了线程因等待它已经拥有的互斥对象而发生死锁。然而,线程必需为每一次等待调用次 ReleaseMutex 函数来释放该互斥对象。两个或多个进程可以调用 CreateMutex 来创建同名的互斥对象,第一个进程实际创建互斥对象以后的进程打开已存在的互斥对象的句柄。这使得多个进程可以得到同一个互斥对象的句柄,从而减轻了用户的负担,使用户不必判定创建进程是否为第一个启动的进程。使用这种技术时,应当把 bInitialOwner 标志设为 FALSE 。 否就很难确定开头时哪一个进程拥有该互斥对象。由于多进程能够拥有相同互斥对象的句柄,通过使用这个对象,可使多进程同步。以下为共享对象机制:· 假如 CreateMutex 中的 lpMutexAttributes参数答应继承,由CreateProcess函数创建的子进程可以继承父近程的互斥对象句柄。· 一个进程可以在调用DuplicateHandle 函数时指定互斥对象句柄来创建一个可以被其他进程使用的双重句柄。一个进程在调用OpenMutex 或 CreateMutex 函数时能指定互斥对象名。· 使用 CloseHandle 函数关闭句柄,进程终止时系统自动关闭句柄。当最终一个句柄被关闭时,互斥对象被销毁。5.ReleaseMutex函数功能:该函数舍弃指定互斥对象的全部权。函数原型:BOOL ReleaseMutex ( HANDLE hMutex)。 参数:· hMutex : 互斥对象句柄。为CreateMutex 或 OpenMutex 函数的返回值。返回值:假如函数调用胜利,那么返回值是非零值。假如函数调用失败,那么返回值是零值。如想获得更多错误信息,请调用 GetLastError 函数。备注:假如调用线程不拥有互斥对象,ReleaseMutex 函数失败。一个线程通过调用等待函数拥有互斥对象。创建该互斥对象的线程也拥有互斥对象。而不需要调用等待函数。当互斥对象的全部者线程不再需要互斥对象时,它可以调用ReleaseMutex 函数。当个线程拥有个互斥对象后,它可以用该互斥对象多次调用等待函数而不会堵塞。这防止一个线程等待一个它已拥有的互斥对象时显现死锁。不过,为了释放全部权,该线程必需为每一个等待操作调用一次ReleaseMutex 函数。6.WaitForSingleObject函数功能:当以下情形之一发生时该函数返回:(1)指定对象处于信号态。(2)超时。函数原型:DWORD WaitForSingleObject HANDLE hHandle, DWORD dwMilliseconds。参数:可编辑资料 - - - 欢迎下载精品名师归纳总结· hHandle : 等待对象句柄。如想明白指定句柄的对象类型列表,参阅下面备注部分。在 WindowsNT 中,句柄必需有 SYNCHRONIZE拜访权限。如想获得更多的信息,请查看Standard Access Rights 。· dwMilliseconds: 指定以毫秒为单位的超时间隔。假如超时,即使对象的状态是非信号态的并且没有完成,函数也返回。假如dwMillseconds 是 0,函数测试对象的状态并马上返回。假如dwMillseconds 是INFINITE ,函数从不超时。返回值:假如函数调用胜利,返回值说明引起函数返回的大事。可能值如下:WAIT_ABANDONED:指定对象是互斥对象,在线程被终止前,线程没有释放互斥对象。互斥对象的所属关系被授予调用线程,并且该互斥对象被置为非信号态。WAIT_OBJECT_0 :指定对象的状态被置为信号态。WAIT_TIMEOUT:超时,并且对象的状态为非信号态。假如函数调用失败,返回值是WAIT_FAILED。如想获得更多错误信息,请调用GetLastError 函数。备注:WaitForSingleObjects 函数打算等待条件是否被满意。假如等待条件并没有被满意,调用线程进入个高效的等待状态,当等待满意条件时占用特别少的处理器时间。在运行前。一个等待函数修改同步对象类型的状态。修改仅发生在引起函数返回的对象身上。例如,信号得计数减 1。WaitForSingleObjects 函数能等待的对象包括:Change notification 转变通告 : Console input 掌握台输入 。 Event 大事 。 Job作业 。Mutex 互斥对象 。 Process进程 。 Semaphore信号量 。 Thread 线程 。 Waitable timer 可等待定时器 。当使用等待函数或代码直接或间接创建窗口时,肯定要当心。假如一个线程创建了任何窗口,它必需处理进程消息。消息广播被发送到系统的全部窗口。一个线程用没有超时的等待函数或许会引起系统死锁。间接创建窗口的两个例子是 DDE 和 COM CoInitialize 。因此,假如用户有一个创建窗口的线程,用MsgWaitForMultipleObjects或 MsgWaitForMultipleObjectEx函数,而不要用 SignalObjectAndWait 函数。7.WaitForMultipleObjects函数功能:WaitForMultipleObjects函数当以下条件之一满意时返回:(1)任意一个或全部指定对象处于信号态。2超时间隔已过。函数原型:DWORD WaitForMultipleObjects DWORD nCount, CONST HANDLE *lpHandles,BOOL fWaitAll, DWORD dwMilliseconds。参数:· nCount : 指定由 lpHandles 所指向的数组中的句柄对象数目最大对象句柄数目MAXIMUM_WAIT_OBJECTS 。· lpHandles : 指向对象句柄数组的指针。该数组可以包含不同类型对象的句柄。在WindowsNT 中,该句柄必需有 SYNCHRONIZE拜访权限。如想获得更多的信息,请查看Standard Access Rights。· fWaitAll : 指定等待类型。假如为TRUE ,当 lpHandles 指向的数组里的全部对象为信号态时,函数返回。假如为 FALSE ,当由 lpHandles 指向的数组里的任对象为信号态时,函数返回。对于后者,返回值指出引起函数返回的对象。· dwMilliseconds: 指定以毫秒为单位的超时间隔。假如超时,即使bWaitAll 参数指定的条件没有满意, 函数也返回。假如dwMilliseconds 是 0,函数测试指定对象的状态并马上返回。假如dwMilliseconds是INFINITE ,函数从不超时。返回值。假如函数调用胜利,返回值说明引起函数返回的大事。可能值如下:WAIT_OBJECT_0到 WAIT_OB JECT0+ nCount-1:假如 bWaitAll 为 TRUE ,那么返回值说明全部指定对象的状态为信号态。假如bWaitAll 为 FALSE ,那么返回值减去WAIT_OBJECT_0说明引起函数返回的对象的可编辑资料 - - - 欢迎下载精品名师归纳总结pHandles 数组索引。假如多于一个对象变为信号态,就返回的是数组索引最小的信号态对象索引。WAIT_ABANDONED_0 到 WAIT_ABANDONED_0+nCount-1 :假如 bWaitAll 为 TRUE ,那么返回值说明全部指定对象的状态为信号态,并且至少一个对象是己舍弃的互斥对象。假如 bWaitAll 为 FALSE ,那么返回值减去 WAIT_ABANDONED_0 说明引起函数返回的舍弃互斥对象的 pHandles 数组索引。WAIT_TIMEOUT :超时并且由参数 bWaitAll 指定的条件没有满意。假如函数调用失败,返回值是 WAIT_FAILED 。如想获得更多错误信息,请调用 GetLastError 函数。8.CreateSemapore函数功能:该函数是创建一个出名或者无名信号对象。函数原型:HANDLE CreatSemaphoreLPSECURITY_ATTRIBUTES lpAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName。参数。· LpAttributes : 安全属性。假如是NULL 就表示要使用默认属性。· lInitialCount : Semaphore的初值。必需大于或等于0,并且小于或等于MaxmumCount 。· lMaximumCount : Semaphore 的最大值。这也就是在同一时间内能够锁住Semaphore之线程的最多个数。· lpName: Semaphore的名称 一个字符串 。任何线程 或进程 都可以依据这一名称引用到这个Semaphore。这个值可以是NULL ,意思是产生个没出名字的Semaphore。返回值:假如胜利就传回一个handle,否就传回 NULL 。不论哪一种情形, GetLastError 都会传回一个合理的结果。假如指定的 Semaphore 名称已经存在,就该函数仍是胜利的,GetLastError 会传回ERROR_ALREADY_EXISTS。9.ReleaseSemaphore函数功能:该函数将指定信号对象的计数增加个指定的数量。函数原型:BOOL ReleaseSemaphore HANDLE hSemaphore, LONG lReleaseCount,LPLONG lpPreviousCount 。参数:· hSemaphore:Semaphore 的 handle。· lReleaseCount: Semaphore现值的增额。该值不行以是负值或0。· lpPreviousCount: 借此返回 Semaphore原先的值。返回值:假如胜利,就返回TRUE 。否就返回 FALSE 。失败时可调用 GetLastError 获得缘由。无论 ReleaseSemaphore对于 Semaphore所造成的当前值怎样增加,都肯定不会超过CreateSemaphore时所指定的 1MaximumCount 。请记住, lpPreviousCount 所传回来的是一个瞬时值。你不行以把1ReleaseCount 加上 lpPreviousCount ,就当做是 semaphore的当前值,由于其他线程可能已经转变了Semaphore的值。与 mutex 不同的是,调用 ReleaseSemaphore的那个线程,并不肯定就是调用WaitXxx 的那个线程。仟何线程都可以在任何时间调用ReleaseSemaphore,解除被任何线程锁定的Semaphore。10.InitializeCriticalSection函数功能:该函数初始化临界区对象: 函数原型:可编辑资料 - - - 欢迎下载精品名师归纳总结VOID InitializeCriticalSection LPCRITIAL_SECTION lpCriticalSection。参数:· lpCritialSection : 指向临界区对象的指针。备注:单进程的全部线程可以使用互斥同步机制的临界区对象。但是,不能保证线程获得临界区全部权的次序, 系统将对全部线程公正处理。进程负责安排临界区对象使用的储备空间,这可以通过声明CRITICAL_SECTION类型的变量来完成。在 使用临界区之前,该进程的一些线程必需使用InitializeCriticalSection或 InitializeCriticalSectionAndSpinCount函数来初始化该临界区对象。11.EnterCriticalSection函数功能: 该函数是等待指定临界区对象的全部权。当调用线程被给予全部权时,该函数返回。函数原型:VOID EnterCriticalSection LPCRITICAL_SECTION lpCriticalSecrion。参数:· lpCriticalSecrion : 指间临界区对象的指针。12.LeaveCriticalSection函数功能: 该函数释放指定临界区对象的全部权。函数原型:VOID LeaveCriticalSection LPCRITICAL_SECTION lpCriticalSection。参数。· lpCriticalSecrion : 指向临界区对象的指针。五、参考源代码下面的程序已经在Windows 2000 上实现。用 VC6.0 创建源文件,将输入文件命名为thread.dat 并放在与源文件相同的文件夹内,编译运行即可。#include"windows.h" #include<conio.h> #include<stdlib.h> #include<fstream.h> #include<io.h> #include<string.h> #include<stdio.h>#define READER 'R'/读者#define WRITER 'W'/写者#define INTE_PER_SEC 1000/每秒时钟中断数目#define MAX_THREAD_NUM 64/最大线程数目#define MAX_FILE_NUM 32/最大数据文件数目#define MAX_STRLEN 32/字符串长度int readcount=0 。/读者数目int writecount=0 。/写者数目CRITICAL_SECTION RP_Write。 /临界区CRITICAL_SECTION cs_Write。CRITICAL_SECTION cs_Read。可编辑资料 - - - 欢迎下载精品名师归纳总结struct ThreadInfoint serial 。/线程序号char entity 。/线程类别(判定是读者线程仍是写者线程)double delay 。/线程推迟double persist。/线程写操作连续时间 。/ 读者优先读者线程/P:读者线程信息void RP_ReaderThreadvoid *p/ 互斥变量HANDLE h_Mutex。h_Mutex=OpenMutexMUTEX_ALL_ACCESS,FALSE,"mutex_for_redcount"。DWORD wait_for_mutex。/等待互斥变量全部权DWORD m_delay 。/推迟时间DWORD m_persist 。int m_serial 。/读文件连续时间/线程序号/ 从参数中获得信息m_serial=ThreadInfo*p->serial。m_delay=DWORDThreadInfo*p->delay*INTE_PER_SEC。m_persist=DWORDThreadInfo*p->persist*INTE_PER_SEC。Sleepm_delay 。/推迟等待printf"Reader thread %d sents the reading require.n",m_serial 。/ 等待互斥信号,保证对readcount 的拜访、修改互斥wait_for_mutex=WaitForSingleObjecth_Mutex,-1。/ 读者数目增加readcount+ 。ifreadcount=1/ 第一个读者,等待资源EnterCriticalSection&RP_Write。ReleaseMutexh_Mutex 。/释放互斥信号/ 读文件printf"Reader thread %d begins to read file.n",m_serial。Sleepm_persist。/ 退出线程可编辑资料 - - - 欢迎下载精品名师归纳总结printf"Reader thread %d finished reading file.n",m_serial。/ 等待互斥信号,保证对readcount 的拜访、修改互斥wait_for_mutex=WaitForSingleObjecth_Mutex,-1。/ 读者数目削减readcount-。ifreadcount=0/ 假如全部的者读完,唤醒写者LeaveCriticalSection&RP_Write。ReleaseMutexh_Mutex 。/释放互斥信号/ 读者优先写者线程/P:写者线程信息void RP_WriterThreadvoid*pDWORD m_delay 。/推迟时间DWORD m_persist 。/写文件连续时间int m_serial 。/线程序号/ 从参数中获得信息m_serial=ThreadInfo*p->serial。m_delay=DWORDThreadInfo*p->delay*INTE_PER_SEC。m_persist=DWORDThreadInfo*p->persist*INTE_PER_SEC。Sleepm_delay 。/推迟等待printf"Writer thread %d sent the wrinting require.n",m_serial。/ 等待资源EnterCriticalSection&RP_Write。/ 写文件printf"Writer thread %d begins to write to the file.n",m_serial。Sleepm_persist。/ 退出线程printf"Writer thread %d finishing writing to the file.n",m_serial。/ 释放资源LeaveCriticalSection&RP_Write。/ 读者优先处理函数/file :文件名可编辑资料 - - - 欢迎下载精品名师归纳总结void ReaderPrioritychar *fileDWORD n_thread=0 。/线程数目DWORD thread_ID 。/线程 IDDWORD wait_for_all。/等待全部线程终止/ 互斥对象HANDLE h_Mutex。h_Mutex=CreateMutexNULL,FALSE,"mutex_for_readcount"。/ 线程对象的数组HANDLE h_ThreadMAX_THREAD_NUM。ThreadInfo thread_infoMAX_THREAD_NUM。readcount=0。/初始化 readcountInitializeCriticalSection&RP_Write。/初始化临界区ifstream inFile 。inFile.openfile 。/打开文件printf"Reader Priority:nn"。whileinFile/ 读入每一个读者、写者的信息inFile>>thread_infon_thread.serial。inFile>>thread_infon_thread.entity。inFile>>thread_infon_thread.delay。inFile>>thread_infon_thread+.persist。inFile.get 。forint i=0 。i<intn_thread 。i+ifthread_infoi.entity=READER | thread_infoi.entity='r'可编辑资料 - - - 欢迎下载精品名师归纳总结else/ 创建读者线程h_Threadi=CreateThreadNULL,0,LPTHREAD_START_ROUTINERP_ReaderThread, &thread_infoi,0,&thread_ID 。/ 创建写者线程h_Threadi=CreateThreadNULL,0,LPTHREAD_START_ROUTINERP_WriterThread, &thread_infoi,0,&thread_ID 。可编辑资料 - - - 欢迎下载精品名师归纳总结/ 等待全部线程终止可编辑资料 - - - 欢迎下载精品名师归纳总结wait_for_all=WaitForMultipleObjectsn_thread,h_Thread,TRUE,-1。printf"All

    注意事项

    本文(操作系统学习课程设计方案 .docx)为本站会员(H****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开