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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、多核編程,大連東軟信息學(xué)院 多核課程組,課程目錄,第2單元主要內(nèi)容,2.1 Windows API 多線程編程 2.2 OpenMP 多線程編程,第4次課程主要內(nèi)容,2.1 Windows API 多線程編程,創(chuàng)建,終止線程的方法 利用同步對(duì)象協(xié)調(diào)線程的運(yùn)行和內(nèi)存訪問 資源互斥 數(shù)據(jù)共享,目標(biāo),引例,輸出 Hello Thread,DWORD WINAPI helloFunc(LPVOID arg) printf (“Hello Threadn”); return 0; main() HANDLE hThread = CreateThread(NULL, 0, helloFunc, NULL,

2、 0, NULL); WaitForSingleObject(hThread, INFINITE); ,引例,定義: 內(nèi)核對(duì)象是由操作系統(tǒng)內(nèi)核分配的,只能由內(nèi)核訪問的一個(gè)內(nèi)存塊,用來供系統(tǒng)和應(yīng)用程序使用和管理各種系統(tǒng)資源。 線程對(duì)象、事件對(duì)象、文件對(duì)象、文件映射對(duì)象、作業(yè)對(duì)象、互斥量、管道對(duì)象、進(jìn)程對(duì)象、信標(biāo)對(duì)象和等待計(jì)時(shí)器對(duì)象等。 對(duì)象都是通過調(diào)用函數(shù)來創(chuàng)建的 。 例如CreateThread(),內(nèi)核對(duì)象,HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, /在系統(tǒng)中使用方法進(jìn)程高級(jí)設(shè)置 DWORD dwStack

3、Size, /線程堆棧大小 LPTHREAD_START_ROUTINE lpStartAddress, /函數(shù)指針,指向?qū)嶋H運(yùn)行的代碼 LPVOID lpParameter, /參數(shù)指針 DWORD dwCreationFlags, /設(shè)置標(biāo)志 LPDWORD lpThreadId); /線程ID,創(chuàng)建線程,LPTHREAD_START_ROUTINE,DWORD WINAPI MyThreadStart(LPVOID p);,創(chuàng)建線程,BOOL CloseHandle (HANDLE hObject);,線程的終止,#include #include DWORD WINAPI helloF

4、unc(LPVOID arg) printf (“Hello Threadn”); return 0; main() HANDLE hThread = CreateThread(NULL, 0, helloFunc, NULL, 0, NULL); ,What Happens?,主線程執(zhí)行太快,子線程沒有執(zhí)行,例子:線程的創(chuàng)建,#include #include BOOL threadDone = FALSE ; DWORD WINAPI helloFunc(LPVOID arg ) printf (“Hello Threadn”); threadDone = TRUE ; return 0;

5、 main() HANDLE hThread = CreateThread(NULL, 0, helloFunc, NULL, 0, NULL ); while (!threadDone); / wasted cycles ! ,Not a good idea!,線程的等待,原型: 等待一個(gè)線程,DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds);,線程的等待,引例,輸出: Hello Thread Hello Thread Hello Thread Hello Thread,原型 The WaitForMultip

6、leObjects() function has the following parameters: nCount lpHandles fWaitAll dwMilliseconds,DWORD WaitForMultipleObjects ( DWORD nCount, CONST HANDLE *lpHandles, / array BOOL fWaitAll, / wait for one or all DWORD dwMilliseconds);,Wait for all: fWaitAll=TRUE Wait for any: fWaitAll=FALSE,多個(gè)線程的等待,const

7、 int numThreads = 4; DWORD WINAPI helloFunc(LPVOID arg ) printf (“Hello Threadn”); return 0; main() HANDLE hThreadnumThreads; for (int i = 0; i numThreads; i+) hThreadi = CreateThread(NULL, 0, helloFunc, NULL, 0, NULL ); WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE) ,引例解決方案,問題思考,輸出: He

8、llo Thread 0 Hello Thread 1 Hello Thread 2 Hello Thread 3,DWORD WINAPI threadFunc(LPVOID pArg) int* p = (int*)pArg; int myNum = *p; printf( “Thread number %dn”, myNum); . . . / from main(): for (int i = 0; i numThreads; i+) hThreadi = CreateThread(NULL, 0, threadFunc, ,輸出的結(jié)果是什么?,問題解決?,下面的表將說明出現(xiàn)問題的原因

9、,分析,在多線程應(yīng)用將遇到的問題,多線程問題數(shù)據(jù)競(jìng)爭(zhēng),數(shù)據(jù)競(jìng)爭(zhēng) Read/Write 競(jìng)爭(zhēng) Write/Write 競(jìng)爭(zhēng),多線程問題數(shù)據(jù)競(jìng)爭(zhēng),如何解決數(shù)據(jù)競(jìng)爭(zhēng),在多線程應(yīng)用中避免數(shù)據(jù)競(jìng)爭(zhēng)的兩種方法 將變量的應(yīng)用范圍具體到每一個(gè)線程內(nèi)部 變量聲明在線程內(nèi) 線程本地存儲(chǔ)Thread Local Storage (TLS) 以臨界的方法控制并行訪問同步對(duì)象 Critical section 臨界區(qū) Mutex 互斥 Semaphore 信號(hào)量 Event 事件,DWORD WINAPI threadFunc(LPVOID pArg) int myNum = *(int*)pArg); printf(

10、 “Thread number %dn”, myNum); . . . for (int i = 0; i numThreads; i+) tNumi = i; hThreadi = CreateThread(NULL, 0, threadFunc, ,本地存儲(chǔ),編程實(shí)現(xiàn),1100 = ?,Critical section 臨界區(qū) Mutex 互斥 Semaphore 信號(hào)量 Event 事件,同步對(duì)象,臨界區(qū),特點(diǎn) 輕量級(jí) 常用 非內(nèi)核對(duì)象,臨界區(qū),相關(guān)接口 CRITICAL_SECTION cs /定義臨界區(qū) IntializeCriticalSection(,void WINAPI De

11、leteCriticalSection( LPCRITICAL_SECTION lpCriticalSection);,EnterCriticalSection(,void WINAPI LeaveCriticalSection( LPCRITICAL_SECTION lpCriticalSection );,臨界區(qū),#define NUMTHREADS 4 CRITICAL_SECTION g_cs; / 為什么定義成全局變量 int g_sum = 0; DWORD WINAPI threadFunc(LPVOID arg ) int mySum = bigComputation(); E

12、nterCriticalSection( ,指導(dǎo)案例:臨界區(qū),編程實(shí)現(xiàn),11000000 = ?,特點(diǎn) 內(nèi)核對(duì)象 被一個(gè)線程擁有 進(jìn)程、線程間的同步 跨進(jìn)程進(jìn)行同步訪問。為獲得一個(gè)信號(hào)量要進(jìn)行內(nèi)核調(diào)用,開銷大 相關(guān)接口: CreateMutex() / 創(chuàng)建互斥量 WaitForSingleObject() / 等待、加鎖 ReleaseMutex() / 解鎖,互斥量,實(shí)驗(yàn)項(xiàng)目,完成Windows*Threads多線程編程實(shí)驗(yàn),項(xiàng)目二:臨界區(qū)實(shí)驗(yàn)。,事件多用于下列情況: 通知計(jì)算完成 通知數(shù)據(jù)可用 通知消息就緒 等待事件的接口: WaitForSingleObject() /一個(gè)事件 Wai

13、tForMultipleObjects() /多個(gè)事件 事件的兩種類型: Auto-reset events /自動(dòng)重置事件 Manual-reset events /人工重置事件,事件,警告: 慎用 WaitForMultipleObjects() 等待所有的事件,事件的兩種類型,bManualReset TRUE: 人工重置事件 FALSE: 自動(dòng)重置事件 bInitialState TRUE: 激發(fā)態(tài) FALSE: 未激發(fā)態(tài),HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, /

14、確定重置方式 BOOL bInitialState, / 確定事件的初始狀態(tài) LPCSTR lpName); / 事件名稱,事件的創(chuàng)建,SetEvent() ResetEvent(),BOOL SetEvent( HANDLE event );,BOOL ResetEvent( HANDLE event );,事件的設(shè)置和重置,HANDLE hObj 2; / 0 is event, 1 is thread,DWORD WINAPI threadFunc(LPVOID arg) BOOL bFound = bigFind(); if (bFound) SetEvent(hObj0); / 滿足

15、激發(fā)條件 bigFound(); moreBigStuff(); return 0; ,指導(dǎo)案例:事件,. . . hObj0 = CreateEvent(NULL, FALSE, FALSE, NULL); hObj1 = CreateThread(NULL,0,threadFunc,NULL,0,NULL); DWORD waitRet = WaitForMultipleObjects(2, hObj, FALSE, INFINITE); switch(waitRet) case WAIT_OBJECT_0: printf (found it!n); WaitForSingleObject

16、(hObj1, INFINITE) ; case WAIT_OBJECT_0+1 printf (thread donen); break ; default: printf (“wait error: ret %un, waitRet); break ; ,指導(dǎo)案例:事件,. . . hObj0 = CreateEvent(NULL, FALSE, FALSE, NULL); hObj1 = CreateThread(NULL,0,threadFunc,NULL,0,NULL); /* Do some other work while thread executes search */ DW

17、ORD waitRet = WaitForMultipleObjects(2, hObj, FALSE, INFINITE); switch(waitRet) case WAIT_OBJECT_0: printf (found it!n); WaitForSingleObject(hObj1, INFINITE) ; case WAIT_OBJECT_0+1; printf (thread donen); break ; default: printf (“wait error: ret %un, waitRet); break ; ,指導(dǎo)案例:事件,特點(diǎn): 允許一個(gè)或者更多的線程進(jìn)入臨界區(qū)

18、用于與多個(gè)可用資源的訪問 對(duì)信號(hào)量的操作可以概括為以下兩種操作: Wait P(s): s = s-1 Post V(s): s = s+1,信號(hào)量,原型: 0 0.,HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpEventAttributes, LONG lSemInitial, /初始化的值 LONG lSemMax, /最大值 LPCSTR lpSemName);,信號(hào)量的創(chuàng)建,WaitForSingleObject() / wait操作 如果semaphore count = 0, 如果 semaphore count 0, 執(zhí)行信號(hào)量

19、減-1操作后返回. post操作,BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG cReleaseCount, LPLONG lpPreviousCount);,Wait和Post操作,常用于: 控制對(duì)有限數(shù)據(jù)空間的訪問 限制對(duì)一段給定代碼的線程訪問數(shù)量 控制對(duì)有限資源的訪問 當(dāng)信號(hào)量定義為1時(shí),類似于互斥量,信號(hào)量的使用,HANDLE hSem1, hSem2; FILE *fd; int fiveLetterCount = 0;,main() HANDLE hThreadNUMTHREADS; hSem1 = CreateSemaphore(N

20、ULL, 1, 1, NULL); / Binary semaphore hSem2 = CreateSemaphore(NULL, 1, 1, NULL); / Binary semaphore fd = fopen(“InFile”, “r”); / Open file for read for (int i = 0; i NUMTHREADS; i+) hThreadi = CreateThread(NULL,0,CountFives,NULL,0,NULL); WaitForMultipleObjects(NUMTHREADS, hThread, TRUE, INFINITE); fc

21、lose(fd); printf (“Number of five letter words is %dn”, fiveLetterCount); ,指導(dǎo)案例:信號(hào)量,DWORD WINAPI CountFives(LPVOID arg) BOOL bDone = FALSE ; char inLine132; int lCount = 0; while (!bDone) WaitForSingleObject(hSem1, INFINITE); / access to input bDone = (GetNextLine(fd, inLine) = EOF); ReleaseSemaphor

22、e(hSem1, 1, NULL); if (!bDone) if (lCount = GetFiveLetterWordCount(inLine) WaitForSingleObject(hSem2, INFINITE); / update global fiveLetterCount += lCount; ReleaseSemaphore(hsem2, 1, NULL); ,指導(dǎo)案例:信號(hào)量,綜合項(xiàng)目達(dá)成,問題描述 從一單精度浮點(diǎn)數(shù)串中找出乘積最大的連續(xù)的4個(gè)浮點(diǎn)數(shù)。 例如在下列浮點(diǎn)數(shù)串1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 5.0, 3.0, 3.0, 2.0, 9.0, 1.0, 2.0找到4.0,5.0,6.0,5.0. 采用Windows多線程API語言編寫并行程序完成本項(xiàng)目。,HANDLE CreateThread( LPSECURITY_ATTRI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論