操作系统实验线程同步_第1页
操作系统实验线程同步_第2页
操作系统实验线程同步_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验 2: 线程同步一、实验目的(1) 掌握 Windows2000环境下,线程同步。( 2) 熟悉 Windows2000 提供的线程同步与互斥 API。( 3) 用 Windows2000 提 供 的 线 程 同 步 与 互 斥 API 解 决 实 际 问 题(producer-consumer)。二、实验内容生产者与消费者问题的实现。在 Windows 2000 环境下,创建一组“生 产者”线程和一组“消费者”线程,并建立一个长度为 N 的全局数组作为共 享缓冲区。“生产者”向缓冲区输入数据, “消费者”从缓冲区读出数据。当 缓冲区满时,“生产者”必须阻塞,等待“消费者”取走缓冲区数据后

2、将其 唤醒。当缓冲区空时, “消费者”阻塞,等待“生产者”生产了产品后将其 唤醒。试用信号量实现“生产者”与“消费者”线程之间的同步。三、实验环境( 1 ) 使用的操作系统及版本。Windows xp professional( 2) 使用的编译系统及版本。Visual c+ 6.0四、实验步骤1 等待一个对象 ( 相当于 p 操作 )WaitForSingleObject 用于等待一个对象。它等待的对象可以为:Change notification :变化通知。Console input :控制台输入。Event :事件。Job:作业。Mutex:互斥信号量。Process :进程。Sema

3、phore计数信号量。Thread:线程。Waitable timer :定时器。返回值:如果成功返回,其返回值说明是何种事件导致函数返回访问描述WAIT_ABANDONED等待的对象是一个互斥(mutex)对象,该互斥对 象没有被拥有它的线程释放,它被设置为不能被唤 醒。WAIT_OBJECT_0指定对象被唤醒。WAIT TIMEOUT超时。2 创建信号量CreateSem aphore用于创建一个信号量。返回值:信号量创建成功,将返回该信号量的句柄。如果给出的信号量名是系统已经存在 的信号量,将返回这个已存在信号量的句柄。如果失败,系统返回NULL可以调用函数GetLastError查询失

4、败的原因。3. 打开信号量Ope nSemaphor用 于打开一个信号量。返回值:信号量打开成功,将返回该信号量的句柄。如果失败,系统返回NULL可以调用函数GetLastError查询失败的原因。4. 增加信号量的值ReleaseSem aphore用于增加信号量的值。返回值:如果成功,将返回一个非0值。如果失败,系统返回0,可以调用函数GetLastError 查询失败的原因。方法一:程序代码:#i ncludevwi ndows.h> #i nclude<iostream.h> static HANDLE S1,S2;static HANDLE hMutex;void

5、producer(int n)for(int i=1;i<=3;i+)WaitForSingleObject(S1,INFINITE);WaitForSingleObject(hMutex,INFINITE);coutvv"生产者"<<nvv" 第"vvivv"次生产产品"<<endl;ReleaseMutex(hMutex);ReleaseSemaphore(S2,1,NULL);void consumer(int n)for(int i=1;i<=3;i+)WaitForSingleObject

6、(S2,INFINITE);WaitForSingleObject(hMutex,INFINITE);coutvv"消费者"<<n<<" 第"vvivv"次消费产品"<<endl;ReleaseMutex(hMutex);ReleaseSemaphore(S1,1,NULL);void main(void)static HANDLE hHandle1,hHandle2,hHandle3,hHandle4;DWORD dwID1,dwID2,dwID3,dwID4;S1=CreateSemaphore

7、(NULL,1,1,"Semphore1");S2=CreateSemaphore(NULL,0,1,"Semphore2");hMutex=CreateMutex(NULL,FALSE,NULL);hHandle1=CreateThread(LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_STA RT_ROUTINE)producer,(LPVOID)1,0,&dwID1);hHandle3=CreateThread(LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_STA RT_ROU

8、TINE)consumer,(LPVOID)1,0,&dwID3);hHandle2=CreateThread(LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_STA RT_ROUTINE)producer,(LPVOID)2,0,&dwID2);hHandle4=CreateThread(LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_STA RT_ROUTINE)consumer,(LPVOID)2,0,&dwID4);Sleep(1000);5初始化临界区InitializeCriticalSection

9、 用于初始化临界区对象。返回值:以下两个 api 相当于 pv 源语操作6进入临界区EnterCriticalSection 等待进入临界区的权限,当获得该权限后进入临界区。 返回值:该函数没有返回值。7退出临界区LeaveCriticalSection 释放临界区的使用权限。返回值: 该函数没有返回值。方法二:程序源代码:#include<windows.h>#include<iostream.h>static HANDLE S1,S2;/ 定义两个信号量 S1 空间CRITICAL_SECTION CS; / 定义一个临界区void producer(int n)f

10、or(int i=1;i<=3;i+)WaitForSingleObject(S1,INFINITE);EnterCriticalSection(&CS);coutvv"生产者"<<nvv" 第"vvivv"次生产产品"<<endl;LeaveCriticalSection(&CS);ReleaseSemaphore(S2,1,NULL);void consumer(int n)for(int i=1;i<=3;i+)WaitForSingleObject(S2,INFINITE);

11、EnterCriticalSection(&CS);coutvv"消费者"<<n<<" 第"vvivv"次消费产品"<<endl;LeaveCriticalSection(&CS);ReleaseSemaphore(S1,1,NULL);void main(void)static HANDLE hHandle1,hHandle2,hHandle3,hHandle4;DWORD dwID1,dwID2,dwID3,dwID4;S1=CreateSemaphore(NULL,1,1,&q

12、uot;Semphore1");S2=CreateSemaphore(NULL,0,1,"Semphore2");InitializeCriticalSection(&CS);hHandle1=CreateThread(LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_STA RT_ROUTINE)producer,(LPVOID)1,0,&dwID1);hHa ndle2=CreateThread(LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_STA RT_ROUTINE)producer,(LPVOID)2,0,&dwID2);hHa ndle3=CreateThread(LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_STA RT_ROUTINE)co nsum

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论