信号量的操作Word文档格式.docx

上传人:b****6 文档编号:17458308 上传时间:2022-12-01 格式:DOCX 页数:8 大小:109.37KB
下载 相关 举报
信号量的操作Word文档格式.docx_第1页
第1页 / 共8页
信号量的操作Word文档格式.docx_第2页
第2页 / 共8页
信号量的操作Word文档格式.docx_第3页
第3页 / 共8页
信号量的操作Word文档格式.docx_第4页
第4页 / 共8页
信号量的操作Word文档格式.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

信号量的操作Word文档格式.docx

《信号量的操作Word文档格式.docx》由会员分享,可在线阅读,更多相关《信号量的操作Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。

信号量的操作Word文档格式.docx

1.实验目的

了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。

2.开发平台及实验环境:

系统平台:

windows环境

实现语言:

C++语言

开发工具:

MicrosoftVisualC++6.0

3.实验要求

通过对windows系统的内核同步对象mutexes和semaphores的使用来实现进程同步的控制。

利用CreateSemaphore、WaitForSingleObject等函数检测内核同步对象的状态。

第二章设计需求

1.信号量的概念

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。

在进入一个关键代码段之前,线程必须获取一个信号量,一旦该关键代码段完成了,那么该线程必须释放信号量。

其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。

为了完成这个过程,需要创建一个信号量VI,然后将AcquireSemaphoreVI以及ReleaseSemaphoreVI分别放置在每个关键代码段的首末端。

确认这些信号量VI引用的是初始创建的信号量。

2.信号量的分类信号量按其用途分为两种

(1).公用信号量:

初值常常为1。

用来实现进程间的互斥。

相关进程均可对其执行P、V操作。

(2).私有信号量:

初值常常为可用资源数,多用来实现进程同步。

拥有该信号量的一类进程可以对其执行P操作,而另一类进程可以对其执行V操作,,多用于并发进程的同步。

信号量按照取值可以分为两种

(1).二元信号量:

仅允许取0和1,主要用于解决进程互斥

(2).一般信号量:

计数信号量,允许取任意整数值,主要用于解决进程同步问题。

3.信号量于PV操作的关系

P操作:

信号量的值减一

如果满足if条件执行了P操作的进程会挂起P操作语句之后的语句都不会再执行。

被挂起的进程除非另一个进程调用V()来唤醒它否则永远不会执行。

V操作:

信号量的值加一

如果满足if条件,执行V操作的进程会去唤醒另一个正在等待的进程(被挂起的进程)。

执行V操作的进程不会自愿停止,V操作后面的语句会接着执行,被唤醒的进程只是进入了就绪队列,并不一定有机会马上被执行

被唤醒的进程,从挂起点接着执行,也就是P操作之后的语句

第三章实例分析

1.设计思想

假设某个饭店有一公共厕所,但是不分男女。

老板规定,当有男生上厕所时,其他男生可以进去,女生不能进入。

有女生先进去的时候其他女生可以进去,男生不能进入。

2.程序代码

#include<

windows.h>

#include<

stdio.h>

#defineTHREADCOUNT40

HANDLEghEvent;

intiCurrentBoy=0;

intiCurrentgirl=0;

DWORDWINAPIBoyWereWCing(LPVOID);

DWORDWINAPIgirlWereWCing(LPVOID);

voidmain()

{

HANDLEaThread[THREADCOUNT];

DWORDThreadID;

inti;

//Createamutexwithnoinitialowner

ghEvent=CreateEvent(

NULL,//defaultsecurityattributes

FALSE,//beManualReset

TRUE,//initiallynotowned

NULL);

//unnamedmutex

if(ghEvent==NULL)

{

printf("

CreateEventerror:

%d\n"

GetLastError());

return;

}

//Createworkerthreads

for(i=0;

i<

THREADCOUNT;

i+=2)

aThread[i]=CreateThread(

0,//defaultstacksize

(LPTHREAD_START_ROUTINE)BoyWereWCing,

NULL,//nothreadfunctionarguments

0,//defaultcreationflags

&

ThreadID);

//receivethreadidentifier

if(aThread[i]==NULL)

CreateThreaderror:

GetLastError());

aThread[i+1]=CreateThread(

(LPTHREAD_START_ROUTINE)girlWereWCing,

if(aThread[i+1]==NULL)

//Waitforallthreadstoterminate

WaitForMultipleObjects(THREADCOUNT,aThread,TRUE,

INFINITE);

//Closethreadandmutexhandles

i++)

CloseHandle(aThread[i]);

CloseHandle(ghEvent);

}

DWORDWINAPIBoyWereWCing(LPVOIDlpParam)

DWORDdwWaitResult;

if(iCurrentBoy==0)

dwWaitResult=WaitForSingleObject(

ghEvent,//handletomutex

INFINITE);

//notime-outinterval

iCurrentBoy++;

else

dwWaitResult=WAIT_OBJECT_0;

switch(dwWaitResult)

//Thethreadgotownershipofthemutex

caseWAIT_OBJECT_0:

__try{

//TODO:

wasbathing

BoyWereWCing...\n"

);

iCurrentBoy--;

__finally{

//Releaseownershipofthemutexobject

if(iCurrentBoy==0)

if(!

SetEvent(ghEvent))

//Dealwitherror.

}

break;

//Thethreadgotownershipofanabandonedmutex

caseWAIT_ABANDONED:

returnFALSE;

returnTRUE;

DWORDWINAPIgirlWereWCing(LPVOIDlpParam)

if(iCurrentgirl==0)

iCurrentgirl++;

//TODO:

girlWereWCing...\n"

iCurrentgirl--;

if(iCurrentgirl==0)

returnTRUE;

3、运行结果截图

4、总结

最开始课程设计的时候,不知道怎么做,经过一番思考后,决定选择信号量的操作这个项目。

设计这个项目不仅仅需要用到编程的知识,还需要编写相关的PV原语。

由于自己的PV原语部分学的不是很好,因此对我来说有点难。

于是我就积极利用书本上的知识来编写PV原语,不懂的地方查资料、上网找、问其他同学,最后终于把课程设计做出来了。

通过这次课程设计,感觉到自己平时动手太少,要经常动手去做实验才能真正学到东西。

尤其是编程更需要平时多加练习才能学好用好。

虽然是自己做的课程设计,但是其中还是有很多不懂的东西是问同学的,因此了解到学习不是单独的,应该是相互交流相互学习的。

参考文献:

1.操作系统原理及应用(Linux)王红

2、计算机网络操作系统原理与应用孔宪军吕滨

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

当前位置:首页 > 小学教育 > 数学

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

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