多線程并行編程模型_第1頁
多線程并行編程模型_第2頁
多線程并行編程模型_第3頁
多線程并行編程模型_第4頁
多線程并行編程模型_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論