版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1-项目一:Windows*Threads多线程编程模块一:基础模块4编译执行,输出结果:简答与思考:写出修改后的HelloThreads的代码。//HelloThreads.cpp:定¡§义°?控?制?台¬¡§应®|用®?程¨¬序¨°的Ì?入¨?口¨²点Ì?。¡ê#include"stdafx.h"#include<windows.h>constintnumThreads=4;DWORDWINAPIhelloFunc(LPVOIDarg){ intmyNum=*((int*)arg);printf("HelloThread!Thread%d\n",myNum); return0;}intmain(intargc,_TCHAR*argv[]){ HANDLEhThread[numThreads];inttNum[numThreads]; for(inti=0;i<numThreads;i++) {tNum[i]=i; hThread[i]= CreateThread(NULL,0,helloFunc,&tNum[i],0,NULL); }WaitForMultipleObjects(numThreads,hThread,TRUE,INFINITE); return0;}项目总结。在主线程中循环调用CreateThread()函数生成四个子线程分别去执行helloFunc()函数,并将线程的句柄保存在hThread数组中,CreateThread()的第四个参数给每个线程传递参数tNum获取该线程号,由helloFunc()的参数接收并指向内容。由于主线程为每个子线程传递了不同的参数,所以通过子线程的执行结果可以判断出四个线程的执行顺序。这个实验要我们初步认识了程序的并行化设计思想,为以后的并行化程序设计打下了基础。模块二:临界区模块3编译执行,记录结果:Pi=Thetimeofcalculationwasseconds6编译执行,记录结果:Pi=Thetimeofcalculationwasseconds7加速比:1.90503951,并行效率:0.47625988简答与思考:1如何进行并行化的?请写出并行化的思路与具体的代码。答:在程序中创建两个子线程,另主线程等待所有的子线程执行结束后退出。代码:#include"stdafx.h"#include<windows.h>#include<time.h>staticlongnum_steps=1000000000;constintgNumThreads=2;doublestep=0.0,pi=0.0,sum=0.0;CRITICAL_SECTIONgCS;DWORDWINAPIthreadFunction(LPVOIDpArg){ intmyNum=*((int*)pArg); doublesum1=0.0,x; for(inti=myNum;i<num_steps;i+=gNumThreads){x=(i+0.5)*step;sum1=sum1+4.0/(1.0+x*x);#include<windows.h>#include<math.h>#include<time.h>#defineNUMTHREADS4#defineSERIES_MEMBER_COUNT100000HANDLE*threadHandles,masterThreadHandle,*eventHandles;CRITICAL_SECTIONcountCS;double*sums;doublex=1.0,res=0.0;intthreadCount=0;doublegetMember(intn,doublex){ doublenumerator=1; for(inti=0;i<n;i++) numerator=numerator*x; if(n%2==0) return(-numerator/n); else returnnumerator/n;}DWORDWINAPIthreadProc(LPVOIDpar){ intthreadIndex=*((int*)par); sums[threadIndex]=0; for(inti=threadIndex;i<SERIES_MEMBER_COUNT;i+=NUMTHREADS) sums[threadIndex]+=getMember(i+1,x); SetEvent(eventHandles[threadIndex]); //SignalMasterthreadthatonemoreprocessingthreadisdone //EnterCriticalSection(&countCS); //threadCount++;//LeaveCriticalSection(&countCS); deletepar; return0;}DWORDWINAPImasterThreadProc(LPVOIDpar){ for(inti=0;i<NUMTHREADS;i++)ResumeThread(threadHandles[i]);//Startcomputingthreads //while(threadCount!=NUMTHREADS){}//busywaituntilallthreadsaredonewithcomputationofpartialsums WaitForMultipleObjects(NUMTHREADS,eventHandles,TRUE,INFINITE); res=0; for(inti=0;i<NUMTHREADS;i++) res+=sums[i]; return0;}intmain(){ clock_tstart,stop; threadHandles=newHANDLE[NUMTHREADS+1]; eventHandles=newHANDLE[NUMTHREADS+1]; //InitializeCriticalSection(&countCS); sums=newdouble[NUMTHREADS];start=clock(); for(inti=0;i<NUMTHREADS;i++) { int*threadIdPtr=newint; *threadIdPtr=i; threadHandles[i]=CreateThread(NULL,0,threadProc,threadIdPtr,CREATE_SUSPENDED,NULL); eventHandles[i]=CreateEvent(NULL,TRUE,FALSE,NULL); } threadHandles[NUMTHREADS]=CreateThread(NULL,0,masterThreadProc,NULL,0,NULL); printf("Countofln(1+x)Mercator'sseriesmembersis%d\n",SERIES_MEMBER_COUNT); printf("Argumentvalueofxis%f\n",(double)x); WaitForMultipleObjects(NUMTHREADS+1,threadHandles,TRUE,INFINITE); stop=clock(); for(inti=0;i<NUMTHREADS+1;i++)CloseHandle(threadHandles[i]); deletethreadHandles; deleteeventHandles; //DeleteCriticalSection(&countCS); deletesums; printf("Resultis%10.8f\n",res); printf("Byfunctioncallln(1+%f)=%10.8f\n",x,log(1+x)); printf("Thetimeofcalculationwas%fseconds\n",((double)(stop-start)/1000.0)); printf("Pressanykey..."); getch(); return0;}3是否可以对该并行化方案进行进一步的优化?如何优化?线程在被创建时就执行,不再去唤醒,“master”只需等待事件被激发,效率就会有所提高。4项目总结。模块四:信号量模块3这是串行代码实现,编译执行,记录结果。6编译执行并行版本,多次运行,记录结果:第1次执行结果:第2次执行结果:第3次执行结果:10修正后项目的输出结果为:简答与思考:1SemaphoreS项目与SemaphoreT项目执行结果不一致的原因是什么?在多线程中fd和TotalWords,TotalEventWords,TotalOddWords属于共享变量,在并发执行的过程中会造成数据冲突。fd对于每个线程是互斥的,是因为在文件指针往下一行改变时,不准许其它线程对该操作有影响,不然就会造成该问题的计数结果不正确的现象;而TotalWords,TotalEventWords,TotalOddWords这几个变量,是计算总的字符串个数,含有偶数数量字符的字符串的个数及含有奇数个字符的字符串的个数,毋庸置疑,它们也是共享资源,在对他们进行累加时,要注意数据冲突。2如何修改SemaphoreT项目源代码?写出修改思路和关键代码。可以采用临界区的方法去做,也可以采用信号量。信号量也是一种内核对象,它可以对当前的资源计数,这是与临界区最大的不同,当资源数量大于0时,等待该信号量的线程就可以获得该资源得以继续执行。改进方案:在代码中应用两个信号量hSem1,hSem2,hSem1用于线程对文件指针fd的互斥,hSem2用于对全局变量TotalWords,TotalEventWords,TotalOddWords的互斥,对于每一个子线程,由于我们的思路是按行计算,然后累加的,对于偶数数量字符的字符串的个数以及含有奇数数量字符串的个数计算,要注意采取巧妙点的处理办法。#include"stdafx.h"#include<windows.h>#include<stdio.h>#include<time.h>FILE*fd;intTotalEvenWords=0,TotalOddWords=0,TotalWords=0;HANDLEhSem1,hSem2;constintNUMTHREADS=4;intGetNextLine(FILE*f,char*Line){ if(fgets(Line,132,f)==NULL)if(feof(f))returnEOF;elsereturn1;}intGetWordAndLetterCount(char*Line){ intWord_Count=0,OddWords=0,EvenWords=0,Letter_Count=0; for(inti=0;i<132;i++) { if((Line[i]!='')&&(Line[i]!=0)&&(Line[i]!='\n'))Letter_Count++; else{ if(Letter_Count!=0){ if(Letter_Count%2){ OddWords++;Word_Count++; Letter_Count=0; } else{ EvenWords++; Word_Count++; Letter_Count=0; } } if(Line[i]==0)break; } } return(Word_Count*10000+OddWords*100+EvenWords);}DWORDWINAPICountWords(LPVOIDarg){BOOLbDone=FALSE;charinLine[132];intlCount=0; while(!bDone) {WaitForSingleObject(hSem1,INFINITE);//进?bDone=(GetNextLine(fd,inLine)==EOF); ReleaseSemaphore(hSem1,1,NULL);//出? if(!bDone){ lCount=GetWordAndLetterCount(inLine); WaitForSingleObject(hSem2,INFINITE);//进?TotalWords+=lCount/10000; TotalOddWords+=(lCount%10000)/100; TotalEvenWords+=lCount%100; ReleaseSemaphore(hSem2,1,NULL);//出?}} re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度孟安与配偶离婚协议:共同财产分割及子女监护协议4篇
- 导演与摄影师2025年度合作协议3篇
- 2025年销售人员合同范本:旅游产品销售合作协议2篇
- 城东小学2025年度智能调光窗帘纱窗采购合同2篇
- 二零二五年度美发店员工培训与职业发展合同4篇
- 2025年度金融衍生品买卖合同标的交易风险管理4篇
- 2025年度绿色能源餐馆司炉员专项聘用合同3篇
- 郑州城市职业学院《交通监控系统》2023-2024学年第一学期期末试卷
- 二零二五版苗木种植保险产品设计与销售合同4篇
- 2025年度房地产租赁融资合同模板4篇
- 2025春夏运动户外行业趋势白皮书
- 《法制宣传之盗窃罪》课件
- 通信工程单位劳动合同
- 2024年医疗器械经营质量管理规范培训课件
- 高低压配电柜产品营销计划书
- 2024年4月自考02202传感器与检测技术试题
- 社会系统研究方法的重要原则
- 重症医学科健康宣教手册
- 2022版《义务教育英语课程标准》解读培训课件
- 五个带头方面谈心谈话范文三篇
- 互联网的发展历程
评论
0/150
提交评论