




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
多核編程大連東軟信息學(xué)院多核課程組多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第1頁!課程目錄第1單元
并行化程序設(shè)計(jì)基礎(chǔ)第2單元
多線程并行編程模型第3單元并行化程序性能調(diào)優(yōu)多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第2頁!第2單元主要內(nèi)容2.1WindowsAPI多線程編程2.2OpenMP多線程編程多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第3頁!
第4次課程主要內(nèi)容2.1WindowsAPI多線程編程多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第4頁!引例輸出HelloThread多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第5頁!定義:內(nèi)核對象是由操作系統(tǒng)內(nèi)核分配的,只能由內(nèi)核訪問的一個(gè)內(nèi)存塊,用來供系統(tǒng)和應(yīng)用程序使用和管理各種系統(tǒng)資源。線程對象、事件對象、文件對象、文件映射對象、作業(yè)對象、互斥量、管道對象、進(jìn)程對象、信標(biāo)對象和等待計(jì)時(shí)器對象等。對象都是通過調(diào)用函數(shù)來創(chuàng)建的。例如CreateThread()內(nèi)核對象多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第6頁!LPTHREAD_START_ROUTINEDWORDWINAPIMyThreadStart(LPVOIDp);創(chuàng)建線程多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第7頁!#include<stdio.h>#include<windows.h>DWORDWINAPIhelloFunc(LPVOIDarg){ printf(“HelloThread\n”); return0;}main(){HANDLEhThread= CreateThread(NULL,0,helloFunc,NULL,0,NULL);}WhatHappens?
主線程執(zhí)行太快,子線程沒有執(zhí)行例子:線程的創(chuàng)建多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第8頁!原型:
等待一個(gè)線程DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);線程的等待多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第9頁!原型
TheWaitForMultipleObjects()functionhasthefollowingparameters:nCountlpHandlesfWaitAlldwMillisecondsDWORDWaitForMultipleObjects(DWORDnCount,CONSTHANDLE*lpHandles,//arrayBOOLfWaitAll,//waitforoneorallDWORDdwMilliseconds);Waitforall:fWaitAll==TRUEWaitforany:fWaitAll==FALSE多個(gè)線程的等待多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第10頁!問題思考輸出:HelloThread0HelloThread1HelloThread2HelloThread3多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第11頁!下面的表將說明出現(xiàn)問題的原因
myNum=*pmyNum=2exitwaitT6p=pArgprint(2)waitT5launchmyNum=*pmyNum=2i++(i==2)T4---p=pArgcreate(&i)T3---launchi++(i==1)T2------create(&i)T1-------i=0T0Thread1Thread()MainTime分析多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第12頁!數(shù)據(jù)競爭Read/Write競爭Write/Write競爭多線程問題—數(shù)據(jù)競爭多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第13頁!DWORDWINAPIthreadFunc(LPVOIDpArg){
intmyNum=*((int*)pArg);printf(“Threadnumber%d\n”,myNum);}...for(inti=0;i<numThreads;i++){
tNum[i]=i;hThread[i]=CreateThread(NULL,0,threadFunc,&tNum[i],0,NULL);}本地存儲(chǔ)多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第14頁!Criticalsection臨界區(qū)Mutex互斥Semaphore信號(hào)量Event事件同步對象多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第15頁!臨界區(qū)相關(guān)接口CRITICAL_SECTIONcs
//定義臨界區(qū)
IntializeCriticalSection(&cs)
//初始化臨界區(qū)DeleteCriticalSection(&cs)
//注銷臨界區(qū)voidWINAPIInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);voidWINAPIDeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第16頁!#defineNUMTHREADS4CRITICAL_SECTIONg_cs;//為什么定義成全局變量intg_sum=0;DWORDWINAPIthreadFunc(LPVOIDarg){intmySum=bigComputation();
EnterCriticalSection(&g_cs);
g_sum+=mySum; //每次只有一個(gè)線程訪問
LeaveCriticalSection(&g_cs);
return0;}main(){ HANDLEhThread[NUMTHREADS];
InitializeCriticalSection(&g_cs);
for(inti=0;i<NUMTHREADS;i++)hThread[i]=CreateThread(NULL,0,threadFunc,NULL,0,NULL);WaitForMultipleObjects(NUMTHREADS,hThread,TRUE,INFINITE);
DeleteCriticalSection(&g_cs);}指導(dǎo)案例:臨界區(qū)多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第17頁!特點(diǎn)內(nèi)核對象被一個(gè)線程擁有進(jìn)程、線程間的同步
跨進(jìn)程進(jìn)行同步訪問。為獲得一個(gè)信號(hào)量要進(jìn)行內(nèi)核調(diào)用,開銷大相關(guān)接口:CreateMutex()
//創(chuàng)建互斥量WaitForSingleObject()
//等待、加鎖ReleaseMutex()
//解鎖互斥量多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第18頁!事件多用于下列情況:通知計(jì)算完成通知數(shù)據(jù)可用通知消息就緒等待事件的接口:WaitForSingleObject()//一個(gè)事件WaitForMultipleObjects()//多個(gè)事件事件的兩種類型:Auto-resetevents//自動(dòng)重置事件Manual-resetevents//人工重置事件事件多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第19頁!
bManualReset
TRUE:人工重置事件FALSE:自動(dòng)重置事件
bInitialState
TRUE:激發(fā)態(tài)FALSE:未激發(fā)態(tài)HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,//確定重置方式BOOLbInitialState,//確定事件的初始狀態(tài)LPCSTRlpName);//事件名稱事件的創(chuàng)建多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第20頁!HANDLEhObj[2];//0isevent,1isthread
DWORDWINAPIthreadFunc(LPVOIDarg){BOOLbFound=bigFind();if(bFound){ SetEvent(hObj[0]);//滿足激發(fā)條件 bigFound();}moreBigStuff();return0;}指導(dǎo)案例:事件多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第21頁!
...hObj[0]=CreateEvent(NULL,FALSE,FALSE,NULL);hObj[1]=CreateThread(NULL,0,threadFunc,NULL,0,NULL);/*Dosomeotherworkwhilethreadexecutessearch*/DWORDwaitRet= WaitForMultipleObjects(2,hObj,FALSE,INFINITE);switch(waitRet){caseWAIT_OBJECT_0:printf("foundit!\n");WaitForSingleObject(hObj[1],INFINITE);caseWAIT_OBJECT_0+1;printf("threaddone\n");break;default:printf(“waiterror:ret%u\n",waitRet);break;}指導(dǎo)案例:事件多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第22頁!
原型:
0<=count<=ISemMax.SemMax>0.HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpEventAttributes,LONGlSemInitial,//初始化的值LONGlSemMax,//最大值LPCSTRlpSemName);信號(hào)量的創(chuàng)建多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第23頁!
常用于:控制對有限數(shù)據(jù)空間的訪問限制對一段給定代碼的線程訪問數(shù)量控制對有限資源的訪問當(dāng)信號(hào)量定義為1時(shí),類似于互斥量信號(hào)量的使用多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第24頁!
DWORDWINAPICountFives(LPVOIDarg){BOOLbDone=FALSE;charinLine[132];intlCount=0;while(!bDone){WaitForSingleObject(hSem1,INFINITE);//accesstoinputbDone=(GetNextLine(fd,inLine)==EOF);ReleaseSemaphore(hSem1,1,NULL);if(!bDone)if(lCount=GetFiveLetterWordCount(inLine)){WaitForSingleObject(hSem2,INFINITE);//updateglobalfiveLetterCount+=lCount;ReleaseSemaphore(hsem2,1,NULL);}}}指導(dǎo)案例:信號(hào)量多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第25頁!
HANDLECreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId);DWORDWINAPIMyThreadStart(LPVOIDp);BOOLCloseHandle(HANDLEhObject);DWORDWaitForMultipleObjects(DWORDnCount,CONSTHANDLE*lpHandles,BOOLfWaitAll,DWORDdwMilliseconds);總結(jié)多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第26頁!
HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,BOOLbInitialState,LPCSTRlpName);BOOLSetEvent(HANDLEevent);BOOLResetEvent(HANDLEevent);總結(jié)多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第27頁!本章小結(jié)并行化程序開發(fā)流程三個(gè)部分六個(gè)階段分解模式數(shù)據(jù)分解任務(wù)分解數(shù)據(jù)競爭臨界區(qū)同步互斥多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第28頁!創(chuàng)建,終止線程的方法利用同步對象協(xié)調(diào)線程的運(yùn)行和內(nèi)存訪問資源互斥數(shù)據(jù)共享目標(biāo)多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第29頁!DWORDWINAPIhelloFunc(LPVOIDarg){ printf(“HelloThread\n”); return0;}main(){HANDLEhThread=CreateThread(NULL,0,helloFunc,NULL,0,NULL);
WaitForSingleObject(hThread,INFINITE);}引例多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第30頁!HANDLECreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes,//在系統(tǒng)中使用方法進(jìn)程高級(jí)設(shè)置 DWORDdwStackSize,//線程堆棧大小
LPTHREAD_START_ROUTINElpStartAddress,//函數(shù)指針,指向?qū)嶋H運(yùn)行的代碼 LPVOIDlpParameter,//參數(shù)指針 DWORDdwCreationFlags,//設(shè)置標(biāo)志 LPDWORDlpThreadId);//線程ID創(chuàng)建線程多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第31頁!BOOLCloseHandle(HANDLEhObject);
線程的終止多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第32頁!#include<stdio.h>#include<windows.h>BOOLthreadDone=FALSE;DWORDWINAPIhelloFunc(LPVOIDarg){printf(“HelloThread\n”);
threadDone=TRUE; return0;}main(){ HANDLEhThread=CreateThread(NULL,0,helloFunc,NULL,0,NULL);
while(!threadDone);//wastedcycles!}Notagoodidea!
線程的等待多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第33頁!引例輸出:HelloThreadHelloThreadHelloThreadHelloThread多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第34頁!constintnumThreads=4;DWORDWINAPIhelloFunc(LPVOIDarg){printf(“HelloThread\n”);return0;}main(){ HANDLEhThread[numThreads];for(inti=0;i<numThreads;i++)hThread[i]=CreateThread(NULL,0,helloFunc,NULL,0,NULL);WaitForMultipleObjects(numThreads,hThread,TRUE,INFINITE)}引例解決方案多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第35頁!DWORDWINAPIthreadFunc(LPVOIDpArg){ int*p=(int*)pArg; intmyNum=*p; printf(“Threadnumber%d\n”,myNum);}...//frommain():for(inti=0;i<numThreads;i++){ hThread[i]=CreateThread(NULL,0,threadFunc,&i,0,NULL);}輸出的結(jié)果是什么?問題解決??多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第36頁!在多線程應(yīng)用將遇到的問題多線程問題Deadlocks死鎖Livelocks活鎖Granularity粒度LoadImbalance負(fù)載平衡DataRaces數(shù)據(jù)競爭多線程問題—數(shù)據(jù)競爭多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第37頁!如何解決數(shù)據(jù)競爭在多線程應(yīng)用中避免數(shù)據(jù)競爭的兩種方法將變量的應(yīng)用范圍具體到每一個(gè)線程內(nèi)部變量聲明在線程內(nèi)線程本地存儲(chǔ)ThreadLocalStorage(TLS)以臨界的方法控制并行訪問——同步對象Criticalsection臨界區(qū)Mutex互斥Semaphore信號(hào)量Event事件多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第38頁!編程實(shí)現(xiàn)1×2×3×……×100=?多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第39頁!臨界區(qū)特點(diǎn)輕量級(jí)常用非內(nèi)核對象多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第40頁!
EnterCriticalSection(&cs)//進(jìn)入臨界區(qū)LeaveCriticalSection(&cs)
//退出臨界區(qū)當(dāng)臨界區(qū)有其他線程時(shí),線程將被阻塞不返回。當(dāng)臨界區(qū)沒有線程時(shí)將返回voidWINAPIEnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);voidWINAPILeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);臨界區(qū)多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第41頁!編程實(shí)現(xiàn)1×2×3×……×1000000=?多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第42頁!實(shí)驗(yàn)項(xiàng)目2完成Windows*Threads多線程編程實(shí)驗(yàn),項(xiàng)目二:臨界區(qū)實(shí)驗(yàn)。多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第43頁!Auto-resetEventsManual-resetEventsEventstayssignaleduntilonewaitingthreadisreleasedEventstayssignaleduntilexplicitlyresettononsignaledbyanAPIcallIfnothreadiswaiting,stateremainssignaledIfallwaitingthreadsarereleased,stateremainssignaledAfterthethreadisreleased,stateisresettononsignaledThreadsnotoriginallywaitingmaystartwaitandbereleased警告:慎用WaitForMultipleObjects()
等待所有的事件事件的兩種類型多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第44頁!SetEvent()ResetEvent()BOOLSetEvent(HANDLEevent);BOOLResetEvent(HANDLEevent);事件的設(shè)置和重置多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第45頁!
...hObj[0]=CreateEvent(NULL,FALSE,FALSE,NULL);hObj[1]=CreateThread(NULL,0,threadFunc,NULL,0,NULL);DWORDwaitRet= WaitForMultipleObjects(2,hObj,FALSE,INFINITE);switch(waitRet){caseWAIT_OBJECT_0: printf("foundit!\n");WaitForSingleObject(hObj[1],INFINITE); caseWAIT_OBJECT_0+1printf("threaddone\n");break;default:printf(“waiterror:ret%u\n",waitRet);break;}指導(dǎo)案例:事件多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第46頁!
特點(diǎn):允許一個(gè)或者更多的線程進(jìn)入臨界區(qū)用于與多個(gè)可用資源的訪問對信號(hào)量的操作可以概括為以下兩種操作:Wait[P(s)]:s=s-1Post[V(s)]:s=s+1信號(hào)量多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第47頁!
WaitForSingleObject()//wait操作如果semaphorecount=0,如果
semaphorecount>0,執(zhí)行信號(hào)量減-1操作后返回.post操作BOOLReleaseSemaphore(HANDLEhSemaphore,LONGcReleaseCount,LPLONGlpPreviousCount);Wait和Post操作多線程并行編程模型共53頁,您現(xiàn)在瀏覽的是第48頁!
HANDLEhSem1,hSem2;FILE*fd;intfiveLetterCount=0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝加工廠職工勞動(dòng)合同
- Unit 3 The art of painting Extended reading (2) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年高中英語譯林版(2020)選擇性必修第一冊
- 浙江工商職業(yè)技術(shù)學(xué)院《國際貿(mào)易理論與政策》2023-2024學(xué)年第二學(xué)期期末試卷
- 重慶文化藝術(shù)職業(yè)學(xué)院《建筑工程質(zhì)量控制》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西新能源科技職業(yè)學(xué)院《視頻特技與非線性編輯》2023-2024學(xué)年第二學(xué)期期末試卷
- 中國石油大學(xué)(華東)《參展實(shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧裝備制造職業(yè)技術(shù)學(xué)院《單片機(jī)原理課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 可克達(dá)拉職業(yè)技術(shù)學(xué)院《社會(huì)調(diào)查原理與方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 濰坊環(huán)境工程職業(yè)學(xué)院《物聯(lián)網(wǎng)通信技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南城市學(xué)院《MBA運(yùn)營管理》2023-2024學(xué)年第二學(xué)期期末試卷
- SHT 3005-2016 石油化工自動(dòng)化儀表選型設(shè)計(jì)規(guī)范
- 2024年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 陽光分級(jí)閱讀 Letters for Mr James 課件
- 占道作業(yè)交通安全設(shè)施設(shè)置技術(shù)要求
- 《肝豆?fàn)詈俗冃浴氛n件
- 地鐵施工管線保護(hù)培訓(xùn)課件
- 農(nóng)村公路質(zhì)量監(jiān)督管理及措施
- 小學(xué)體積單位換算練習(xí)100道及答案
- 第7課《誰是最可愛的人》公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)-2
- 人音版四年級(jí)音樂下冊全冊教學(xué)設(shè)計(jì)教案表格式
- 渣土車司機(jī)安全培訓(xùn)
評(píng)論
0/150
提交評(píng)論