操作系统原理实验五.docx

上传人:b****7 文档编号:9799798 上传时间:2023-02-06 格式:DOCX 页数:9 大小:18.51KB
下载 相关 举报
操作系统原理实验五.docx_第1页
第1页 / 共9页
操作系统原理实验五.docx_第2页
第2页 / 共9页
操作系统原理实验五.docx_第3页
第3页 / 共9页
操作系统原理实验五.docx_第4页
第4页 / 共9页
操作系统原理实验五.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

操作系统原理实验五.docx

《操作系统原理实验五.docx》由会员分享,可在线阅读,更多相关《操作系统原理实验五.docx(9页珍藏版)》请在冰豆网上搜索。

操作系统原理实验五.docx

操作系统原理实验五

实验五线程的同步

1、实验目的

(1)进一步掌握Windows系统环境下线程的创建与撤销。

(2)熟悉Windows系统提供的线程同步API。

(3)使用Windows系统提供的线程同步API解决实际问题。

2、实验准备知识:

相关API函数介绍

1等待对象

等待对象

b5E2RGbCAP

1)等待一个对象

WaitForSingleObject<)用于等待一个对象。

它等待的对象可以为以下对象之一。

·Changeontification:

变化通知。

·Consoleinput:

控制台输入。

·Event:

事件。

·Job:

作业。

·Mutex:

互斥信号量。

·Process:

进程。

·Semaphore:

计数信号量。

·Thread:

线程。

·Waitabletimer:

定时器。

原型:

DWORDWaitForSingleObject(

HANDLEhHandle,//对象句柄

DWORDdwMilliseconds//等待时间

);

参数说明:

(1)hHandle:

等待对象的对象句柄。

该对象句柄必须为SYNCHRONIZE访问。

(2)dwMilliseconds:

等待时间,单位为ms。

若该值为0,函数在测试对象的状态后立即返回,若为INFINITE,函数一直等待下去,直到接收到一个信号将其唤醒,如表2-1所示。

p1EanqFDPw

返回值:

如果成功返回,其返回值说明是何种事件导致函数返回。

表2-1函数描述

访问

描述

WAITABANDONED

等待的对象是一个互斥

WAITOBJECT0

指定对象被唤醒

WAITTIMEOUT

超时

用法举例:

StaticHANDLEhHandlel=NULL。

DWORDdRes。

dRes=WaitForSingleObject(hHandlel,10>。

//等待对象的句柄为hHandlel,等待时间为10msDXDiTa9E3d

2)等待对个对象

WaitForMultiple<)bject<)在指定时间内等待多个对象,它等待的对象与WaitForSingleObject<)相同。

RTCrpUDGiT

原型:

DWORDWaitForMultipleObjects<

DWORDnCount,//句柄数组中的句柄数

CONSTHANDLE*lpHandles,//指向对象句柄数组的指针

BOOLfWaitAll,//等待类型

DWORDdwMilliseconds//等待时间

);

参数说明:

(1)nCount:

由指针*lpHandles指定的句柄数组中的句柄数,最大数是MAXIMUMWAITOBJECTS。

5PCzVD7HxA

(2)*lpHandles:

指向对象句柄数组的指针。

(3)fWaitAll:

等待类型。

若为TRUE,当由lpHandles数组指定的所有对象被唤醒时函数返回;若为FALSE,当由lpHandles数组指定的某一个对象被唤醒时函数返回,且由返回值说明是由于哪个对象引起的函数返回。

jLBHrnAILg

(4)dwMilliseconds:

等待时间,单位为ms。

若该值为0,函数测试对象的状态后立即返回;若为INFINITE,函数一直等待下去,直到接收到一个信号将其唤醒。

xHAQX74J0X

返回值:

如果成功返回,其返回值说明是何种事件导致函数返回。

各参数的描述如表2-2所示。

表2-2各参数描述

访问

描述

WAITOBJECT0to

OBJECT0+nCount-1)

若bWaitAll为TRUE,返回值说明所有被等待的对象均被唤醒;若bWaitAll为FALSE,返回值减去WAITOBJECT0说明lpHandles数组下标指定的对象满足等待条件。

如果调用时多个对象同时被唤醒,则取多个对象中最小的那个数组下标

WAITABANDONED0to

ABANDONED0+nCount-1)

若bWaitAll为TRUE,返回值说明所有被等待的对象均被唤醒,并且至少有一个对象是没有约束的互斥对象;若bWaitAll为FALSE,返回值减去WAITABANDONED0说明lpHandles数组下标指定的没有约束的互斥对象满足等待条件

WAITTIMEOUT

超时且参数bWaitAll指定的条件不能满足

2信号量对象

信号量对象

LDAYtRyKfE

1)创建信号量

CreateSemaphore<))用于创建一个信号量。

原型:

HANDLECreateSemaphore(

LPSECURITYATTRIBUTESlpSemaphoreAttributes,//安全属性Zzz6ZB2Ltk

LONGlInitialCount,//信号量对象的初始值dvzfvkwMI1

LONGlMaximumCount,//信号量的最大值rqyn14ZNXI

LPCTSTRlpName//信号量名EmxvxOtOco

);

参数说明:

<1)lpSemaphoreAttributes:

指定安全属性,为NULL时,信号量得到一个

默认的安全描述符。

(2)lInitialCount:

指定信号量对象的初始值。

该值必须大于等于0,小于等于lMaximumCount。

当其值大于0时,信号量被唤醒。

当该函数释放了一个等待该信号量的线程时,lInitialCount值减1,当调用函数ReleaseSemaphore<)时,按其指定的数量加一个值。

SixE2yXPq5

(3)lMaximumCount:

指出该信号量的最大值,该值必须大于0。

(4)lpName:

给出信号量的名字。

返回值:

信号量创建成功,将返回该信号量的句柄。

如果给出的信号量名是系统已经存在的信号量,将返回这个已存在信号量的句柄。

如果失败,系统返回NULL,可以调用函数GetLastError<)查询失败的原因。

6ewMyirQFL

用法举例:

StaticHANDLEhHandlel=NULL;//定义一个句柄

//创建一个信号量,其初始值为0,最大值为5,信号量的名字为“SemphoreNamel”

HHandle=CreateSemaphore

2)打开信号量

OpenSemaphore<)用于打开一个信号量。

原型:

HANDLEOpenSemaphore<

DWORDdWDesiredAccess,//访问标志

BOOLbInheritHandle,//继承标志

LPCTSTRlpName//信号量名

);

参数说明:

(1)dwDesiredAccess:

指出打开后要对信号量进行何种访问,如表2-3所示。

表2-3访问状态

访问

描述

SEMAPHOREALLACCESS

可以进行任何对信号量的访问

SEMAPHOREMODIFYSTATE

可使用ReleaseSemaphore<)修改信号量的值,使信号量成为可用状态

SYNCHRONIZE

使用等待函数

<2)bInheritHandle:

指出返回的信号量句柄是否可以继承。

<3)lpName:

给出信号量的名字。

返回值:

信号量打开成功,将返回该号量的句柄;如果失败,系统返回NULL,可以调用函数GetLastError<)查询失败的原因。

kavU42VRUs

用法举例:

staticHANDLEhHandlel=NULL;

//打开一个名为“SemphoreNamel”的信号量,之后可使用ReleaseSemaphore<)函数增加信号量的值hHandlel=OpenSemaphore

3)增加信号量的值

ReleaseSemaphore<)用于增加信号量的值。

原型:

BOOLReleaseSemaphore<

HANDLEhSemaphore,//信号量对象句柄

LONGlReleaseCount,//信号量要增加数值

LPLONGlpPreviousCount//信号量要增加数值的地址

);

参数说明:

(1)hSemaphore:

创建或打开信号量时给出的信号量对象句柄。

WindowsNT中建议要使用SEMAPHOREMODIFYSTATE访问属性打开该信号量。

M2ub6vSTnP

(2)IReleaseCount:

信号量要增加的数值。

该值必须大于0。

如果增加该值后,大于信号量创建时给出的lMaximumCount值,则增加操作失效,函数返回FALSE。

0YujCfmUCw

(3)LpPreviousCounte:

接收信号量值的一个32位的变量。

若不需要接收该值,可以指定为NULL。

eUts8ZQVRd

返回值:

如果成功,将返回一个非0值;如果失败,系统返回0,可以调用函数GetLastError<)查询失败的原因。

sQsAEJkW5T

用法举例:

staticHANDLEhHandlel=NULL。

BOOLrc。

Rc=ReleaseSemaphore(hHandlel,l,NULL>。

//给信号量的值加1

3、实验内容

完成主、子两个线程之间的同步,要求子线程先执行。

在主线程中使用系统调用GreateThread<)创建一个子线程。

主线程创建子线程后进入阻塞状态,直到子线程运行完毕后唤醒主线程。

GMsIasNXkA

4、实验要求

能正确使用等待对象WaitForSingleObject<)或WaitForMultipleObject<)及信号量对象CreateSemaphore<)、OpenSemaphore<)、ReleaseSemaphore<)等系统调用,进一步理解线程的同步。

TIrRGchYzg

5、实验指导

具体操作过程:

在Microsoft VisualC++6.0环境下建立一个MFC支持的控制台工程文件,编写C程序,在程序中使用CreateSemaphore等待该信号量及使用ReleaseSemaphore<)释放该信号量,然后创建一个子线程,主线程创建子线程后调用WaitForSingleObject

子线程结束,调用ReleaseSemaphore

7EqZcWLZNX

6、实验总结

该实验完成了主、子线程的同步,主线程创建子线程后,主线程阻塞,让子线程先执行,等子线程执行完毕后,由子线程唤醒主线程。

lzq7IGf02E

7、实验展望

上面的程序完成了主、子两个线程执行先后顺序的同步关系,思考以下问题。

(1)如何实现多个线程的同步?

(2)若允许子线程执行多次后主线程再执行,又如何设置信号量的初值?

(3)

8、申明:

9、所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。

(1)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 国外设计风格

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1