您好,欢迎访问三七文档
实验报告课程名称:多核多线程技术院(系):信息与控制工程学院专业班级:计算机科学与技术姓名:学号:0906201指导教师:2012年11月21日第1页实验一WindowsAPI多线程编程本实验分为四个模块;分别为基础练习,临界区实验,事件实验,信号量实验。通过本次实验逐步熟悉和掌握Win32API多线程编程的语法结构、基本思路和方法。理解API之间的调用关系,参数的含义。一、实验目的1、掌握MSVisualStudio2010编写编译Win32API多线程程序的方法;2、掌握Win32API编写多线程程序的语法;3、掌握Win32API编写多线程程序的思路;4、掌握Win32多线程API的应用;5、能解决简单的数据竞争。二、实验环境1、WindowsXP系统2、MicrosoftVisualStudio2010三、相关知识1、内核对象的概念:由操作系统内核分配的,只能由内核访问的一个内存块,用来供系统和应用程序使用和管理各种系统资源。2、Windows多线程API的基本管理线程的创建:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);线程的终止:VOIDExitThread(DWORDdwExitCode)BOOLCloseHandle(HANDLEhObject)线程的挂起与恢复:DWORDSuspendThread(HANDLEhThread)第2页DWORDResumeThread(HANDLEhThread)线程间的等待:DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);DWORDWaitForMultipleObjects(DWORDnCount,CONSTHANDLE*lpHandles,BOOLfWaitAll,DWORDdwMilliseconds);3、线程间的同步与临界区相关的API:voidWINAPIInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);voidWINAPIEnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);voidWINAPILeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);voidWINAPIDeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);与事件相关的API:HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,BOOLbInitialState,LPCSTRlpName);DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);DWORDWaitForMultipleObjects(DWORDnCount,CONSTHANDLE*lpHandles,BOOLfWaitAll,DWORDdwMilliseconds);BOOLSetEvent(HANDLEevent);BOOLResetEvent(HANDLEevent);与信号量相关的API:HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpEventAttributes,LONGlSemInitial,LONGlSemMax,LPCSTRlpSemName);DWORDWaitForSingleObject(第3页HANDLEhHandle,DWORDdwMilliseconds);DWORDBOOLReleaseSemaphore(HANDLEhSemaphore,LONGcReleaseCount,LPLONGlpPreviousCount);四、实验原理线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完后再执行。在多核的机器上,调度程序可将多个线程放到不同的处理器核上去运行,这样可使处理器任务平衡,并提高系统的运行效率。Windows是一种多任务的操作系统,在Windows的一个进程内包含一个或多个线程。32位Windows环境下的Win32API提供了多线程应用程序开发所需要的接口函数,而利用VC中提供的标准C库也可以开发多线程应用程序,相应的MFC类库封装了多线程编程的类,用户在开发时可根据应用程序的需要和特点选择相应的工具。多线程编程在Win32方式下和MFC类库支持下的原理是一致的,进程的主线程在任何需要的时候都可以创建新的线程。当线程执行完后,自动终止线程;当进程结束后,所有的线程都终止。所有活动的线程共享进程的资源,因此,在编程时需要考虑在多个线程访问同一资源时产生冲突的问题。当一个线程正在访问某进程对象,而另一个线程要改变该对象,就可能会产生错误的结果,编程时要解决这个冲突。五、实验内容模块一:基础模块实验步骤:1、用MicrosoftVisualStudio2005创建控制台项目HelloThreads。2、创建HelloThreads.cpp文件,内容如下:#includestdafx.h#includewindows.h#includestdio.hconstintnumThreads=4;DWORDWINAPIhelloFunc(LPVOIDpArg)第4页{printf(HelloThread\n);return0;}int_tmain(intargc,_TCHAR*argv[]){HANDLEhThread[numThreads];inttNum[10];for(inti=0;inumThreads;i++){tNum[i]=i;hThread[i]=CreateThread(NULL,0,helloFunc,NULL,0,NULL);WaitForMultipleObjects(numThreads,hThread,TRUE,INFINITE);}return0;}3点击项目—HelloThreads属性菜单,按图1-1~图1-4配置项目属性。图1-1.项目属性设置–C/C++Folder–DebugOptions第5页图1-2项目属性设置–C/C++Folder–OptimizationOptions4、编译执行,输出结果如下:第6页5、修改代码,使之输出结果可以表示出各线程的输出顺序。修改代码如下:#includestdafx.h#includewindows.hconstintnumThreads=4;DWORDWINAPIhelloFunc(LPVOIDpArg){intj=*(int*)pArg;printf(HelloThread%d\n,j);return0;}int_tmain(intargc,_TCHAR*argv[]){HANDLEhThread[numThreads];inttNum[4];for(inti=0;inumThreads;i++){tNum[i]=i;hThread[i]=CreateThread(NULL,0,helloFunc,&tNum[i],0,NULL);}WaitForMultipleObjects(numThreads,hThread,TRUE,INFINITE);return0;}运行结果如下:第7页模块二:临界区实验本模块将以数值积分的方法计算Pi的值,采用Win32API来实现程序的并行化。实验步骤:1、用MicrosoftVisualStudio2005创建控制台项目WinPi。2、创建WinPi.cpp,内容如下:#includeiostream#includewindows.h#includetime.hstaticlongnum_steps=10000000;doublestep,pi;intmain(){clock_tstart,stop;start=clock();inti;doublex,sum=0.0;step=1.0/(double)num_steps;for(i=0;inum_steps;i++){x=(i+0.5)*step;sum=sum+4.0/(1.0+x*x);}pi=step*sum;stop=clock();printf(pi=%12.9f\n,pi);printf(thetimeofwas%fs\n,((double)(stop-start)/1000.0));}3、编译执行,Pi的值为:3.141592654Thetimeofcalculationwas11.6560000seconds第8页4、将WinPi.cpp程序修改为WindowsThreads并行程序。(1)分析代码中的并行域是:(2)定义线程执行的函数。函数原型为DWORDWINAPI函数名(LPVOIDp);(3)提取并行域代码,作为(2)中定义的函数的函数体(4)生成多个线程调用(3)中的函数(5)解决线程间的同步和互斥。5、采用临界区的方法进行必要的互斥。6、编译执行,Pi的值为:3.1415926Thetimeofcalculationwas6.2580000seconds第9页模块三:事件实验本实验利用麦凯特尔对数级数估算ln(1+x),-1x=1的值。线程被创建时是挂起的状态。这些线程被一个master线程唤醒。线程将分别执行自己的任务,master线程将等待所有的线程执行完毕后,汇总每一个线程的执行结果。实验步骤:1、用MicrosoftVisualStudio2005创建控制台项目ThreadEvent。2、创建ThreadEvent.cpp,内容如下:#includeconio.h#includewindows.h#includemath.h#includetime.h#includeiostream#defineNUMTHREADS4#defineSERIES_MEMBER_COUNT100000HANDLE*threadHandles,masterThreadHandle;CRITICAL_SECTIONcountCS;double*sums;doublex=1.0,res=0.0;第10页intthreadCount=0;doublegetMember(intn,doublex){doublenumerator=1;for(inti=0;in;i++)numerator=numerator*x;if(n%2==0)return(-numerator/n);returnnumerator/n;}DWORDWINAPIthreadProc(LPVOIDpar){intthreadIndex=*((int*)par);sums[threadIndex]=0;for(inti=threadIndex;iSERIES_MEMBER_COUNT;i+=NUMTHREADS)sums[threadIndex]+=getMember(i+1,x);EnterCriticalSection(&countCS);threadCount++;LeaveCriticalSectio
本文标题:多核实验报告
链接地址:https://www.777doc.com/doc-5919323 .html