预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验3:使用CSemaphore类实现对临界资源的访问实验目的:进程的同步问题是操作系统处理机管理的一大核心问题,为了更好的理解和掌握操作系统管理的思想,现通过临界区的互斥访问来了解对临界资源的处理过程。CSemaphore类可以很好地处理多线程对临界资源的访问,通过本实验提高学生对临界资源互斥访问的认识。实现环境硬软件环境自己填实现内容参照下面实现内容自己填写(要概括,突出重点,步骤,切忌应付)实现结果写出自己的实现结果,如有问题,找出问题所在(总结、体会也可以附在后面)当需要一个计数器来限制可以使用某个线程的数目时,可以使用“信号量”对象。CSemaphore类的对象保存了对当前访问某一指定资源的线程的计数值,该计数值是当前还可以使用该资源的线程的数目。如果这个计数达到了零,则所有对这个CSemaphore类对象所控制的资源的访问尝试都被放入到一个队列中等待,直到超时或计数值不为零时为止。一个线程被释放已访问了被保护的资源时,计数值减1;一个线程完成了对被控共享资源的访问时,计数值增1。这个被CSemaphore类对象所控制的资源可以同时接受访问的最大线程数在该对象的构建函数中指定。CSemaphore类的构造函数原型及参数说明如下:CSemaphore(LONGlInitialCount=1,LONGlMaxCount=1,LPCTSTRpstrName=NULL,LPSECURITY_ATTRIBUTESlpsaAttributes=NULL);lInitialCount:信号量对象的初始计数值,即可访问线程数目的初始值;lMaxCount:信号量对象计数值的最大值,该参数决定了同一时刻可访问由信号量保护的资源的线程最大数目;后两个参数在同一进程中使用一般为NULL,不作过多讨论;在用CSemaphore类的构造函数创建信号量对象时要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时,则说明当前占用资源的线程数已经达到了所允许的最大数目,不能再允许其它线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源数加1。下面给出一个简单实例来说明CSemaphore类的用法。例程10MultiThread10建立一个基于对话框的工程MultiThread10,在对话框IDD_MULTITHREAD10_DIALOG中加入一个按钮和三个编辑框控件,按钮的ID为IDC_START,标题为“同时写‘A’、‘B’、‘C’”;三个编辑框的ID分别为IDC_A、IDC_B和IDC_C,属性都选中Read-only;在MultiThread10Dlg.h文件中声明两个线程函数:UINTWriteA(LPVOIDpParam);UINTWriteB(LPVOIDpParam);UINTWriteC(LPVOIDpParam);使用ClassWizard分别给IDC_A、IDC_B和IDC_C添加CEdit类变量m_ctrlA、m_ctrlB和m_ctrlC;在MultiThread10Dlg.cpp文件中添加如下内容:为了文件中能够正确使用同步类,在文件开头添加:#include"afxmt.h"定义信号量对象和一个字符数组,为了能够在不同线程间使用,定义为全局变量:CSemaphoresemaphoreWrite(2,2);//资源最多访问线程2个,当前可访问线程数2个charg_Array[10];添加三个线程函数:UINTWriteA(LPVOIDpParam){CEdit*pEdit=(CEdit*)pParam;pEdit->SetWindowText("");WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);CStringstr;for(inti=0;i<10;i++){pEdit->GetWindowText(str);g_Array[i]='A';str=str+g_Array[i];pEdit->SetWindowText(str);Sleep(1000);}ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);return0;}UINTWriteB(LPVOIDpParam){CEdit*pEdit=(CEdit*)pP