实践三:用Win32同步对象解决兄弟问题Word文档下载推荐.docx
- 文档编号:13091465
- 上传时间:2022-10-04
- 格式:DOCX
- 页数:5
- 大小:10.97KB
实践三:用Win32同步对象解决兄弟问题Word文档下载推荐.docx
《实践三:用Win32同步对象解决兄弟问题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实践三:用Win32同步对象解决兄弟问题Word文档下载推荐.docx(5页珍藏版)》请在冰豆网上搜索。
2、主要数据结构
CRITICAL_SECTION RP_Write;
/*定义CRITICAL_SECTION类型的全局变量*/
3、主要代码结构
在线程中的无限do-while循环中执行以下步骤:
执行EnterCriticalSection(&
RP_Write);
来请求互斥对象所有权,当函数返回WAIT_OBJECT_0时,表示可以访问临界区资源,当返回WAIT_ABANDONED时,表示其它线程在访问临界区资源,本线程不能访问,变成等
待状态。
当访问完临界区资源后,线程要调用LeaveCriticalSection(&
函数释放
临界区对象。
4、主要代码分析#include<
windows.h>
#include<
conio.h>
stdlib.h>
fstream.h>
stdio.h>
#defineINTE_PER_SEC 1000
#defineMAX_THREAD_NUM 64
structThreadInfo
{
intserial;
double delay;
};
intaccnt1=0;
intaccnt2=0;
intaccnt;
//TreadObjectArray
HANDLEh_Thread[MAX_THREAD_NUM];
ThreadInfo thread_info[MAX_THREAD_NUM];
voidaccount(char*file);
voidacc(void*p);
////////////////////////////////////////////////////////
//mainfuction
////////////////////////////////////////////////////////intmain(intagrc,char*argv[])
charch;
while(TRUE)
//Clearescreensystem("
cls"
);
//displaypromptinfoprintf("
*********************************************\n"
);
printf("
1.Starttest\n"
printf("
2.ExittoWindows\n"
Inputyourchoice(1or2):
"
//ifthenumberinputediserror,retry!
do{
ch=(char)_getch();
}while(ch!
='
1'
&
&
ch!
2'
system("
if(ch=='
)
account("
ex3"
elseif(ch=='
return0;
\nPressanykeytofinishthisProgram.\nThankyoutestthisProggram!
\n"
_getch();
}//endwhile
}//endmain
voidaccount(char*file)
DWORDn_thread=0;
DWORDthread_ID;
DWORDwait_for_all;
InitializeCriticalSection(&
RP_Write);
//initcriticalsectoinifstream inFile;
inFile.open(file);
//openfile
printf("
Now,WebegintoreadthreadInformationtothread_infoarray\n\n"
while(inFile)
//readeverythreadinfoinFile>
>
thread_info[n_thread].serial;
inFile>
thread_info[n_thread++].delay;
inFile.get();
//Createallthread
for(inti=0;
i<
(int)(n_thread);
i++)
//Createathread
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(acc),&
thread_info[i],0,&
thread_ID);
}//endfor
//Createthread
//waitingallthreadwillbeenfinished
wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);
AllthreadshavefinishedOperating.\n"
}//endaccount
voidacc(void*p)
DWORDm_delay;
intm_serial;
inttmp1,tmp2,rand_num;
intcounter=0;
//getinfofroampara
m_serial=((ThreadInfo*)(p))->
serial-1;
m_delay =(DWORD)(((ThreadInfo*)(p))->
delay*INTE_PER_SEC);
do{
EnterCriticalSection(&
//begincritical_section
Iamthread %d,Iamdoing %05dthstep\n"
m_serial,counter);
tmp1=accnt1;
tmp2=accnt2;
rand_num=rand();
accnt1=tmp1-rand_num;
accnt1:
%d\t"
accnt1);
Sleep(m_delay);
accnt2=tmp2+rand_num;
accnt2:
accnt=accnt1+accnt2;
accnt:
%d\n"
accnt);
. \n"
//critical_section endcounter++;
LeaveCriticalSection(&
}while((accnt==0)&
(counter<
10));
Nowaccnt1+accnt2= %05d\n"
}//endacc
三、实践结果
1、基本数据
(一)源程序代码行数:
115
(二)完成实践投入的时间(小时数):
2
A、资料查阅时间:
1
B、编程调试时间:
2、测试数据设计
11
23
3、测试结果分析
程序执行结果正确,两个线程互斥访问,count结果总为0。
图如程序2结果。
此处不再贴图。
四、实践体会
1、实践过程中遇到的问题及解决过程
之前对于临界区对象了解的比较少,用互斥对象的时候比较多,所以在编程之前在
MSDN上查询了一下临界区对象的创建和使用方法。
2、实践过程中产生的错误及原因分析无。
3、实践体会和收获
通过本次实践,了解了如何用Win32提供的同步对象解决线程互斥访问临界区资源的问题,将操作系统课程中学到的知识成功的运用到了程序编程中,对以后职业生涯中的多线程编程有很重要的作用。
附件:
参考文献
1汤子灜著.《计算机操作系统》(修订版)[M].西安:
西安电子科技大学出版社.20002JeffreyRichter著,王建华等译.Windows核心编程(第四版)[M].北京:
机械工业出版社出版社.2000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实践 Win32 同步 对象 解决 兄弟 问题