版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Multicore
ProgrammingInstructor:
Zhang
Weizhe
(
)Computer
Network
and
Information
Security
TechniqueResearch
Center
,
School
of
Computer
Science
andTechnology,
Harbin
Institute
of
TechnologyWindows多線程編程及調(diào)優(yōu)Windows線程庫(kù)介紹Win32API是Windows操作系統(tǒng)為內(nèi)核以及應(yīng)用程序之間提供的接口,將內(nèi)核提供的功能進(jìn)行函數(shù)封裝,應(yīng)用程序通過(guò)調(diào)用相關(guān)的函數(shù)獲得相應(yīng)的系統(tǒng)功能。MFC是微軟基礎(chǔ)函數(shù)類庫(kù)(
FoundationClasses),由微軟提供的,用類庫(kù)的方式將Win32API進(jìn)行封裝,
以類的方式提供給開發(fā)者。.NET
Framework
由兩部分構(gòu)成:公共語(yǔ)言運(yùn)行庫(kù)(Common
LanguageRuntime
,CLR)和Framework類庫(kù)(Framework
Class
Library
,F(xiàn)CL)。.NET基礎(chǔ)類庫(kù)的System.Threading命名空間提供了大量的類和接口來(lái)支持多線程。所有與多線程機(jī)制相關(guān)的類都存放在System.Threading命名空間中。使用win32線程APIWin32函數(shù)庫(kù)中提供了操作多線程的函數(shù),包括創(chuàng)建線程、管理線程、終止線程、線程同步等接口。線程函數(shù)arm);DWORD
WINAPI
ThreadFunc
(LPVOID
lpvThre線程創(chuàng)建HANDLE
CreateThread
(LPSECURITY_ATTRIBUTES
lpThreadAttributes,SIZE_T
dwStackSize,LPTHREAD_START_ROUTINE
lpStartAddress,LPVOID
lpParameter,DWORD
dwCreationFlags,LPDWORD
lpThreadId);線程管理設(shè)置線程的優(yōu)先級(jí)線程優(yōu)先級(jí)=進(jìn)程優(yōu)先級(jí)+線程相對(duì)優(yōu)先級(jí)Bool
SetThre riority
(HANDL
E
hPriority
,
int
nPriority)線程的掛起與恢復(fù)進(jìn)程中的每個(gè)線程都有掛起計(jì)數(shù)器(suspendcount)
。當(dāng)掛起計(jì)數(shù)器值為0時(shí),線程被執(zhí)行;當(dāng)掛起計(jì)數(shù)器值大于0時(shí),調(diào)度器不去調(diào)度該線程。DWORD
SuspendThread(HANDLE
hThread);DWORD
ResumeThread(HANDLE
hThread);線程等待一組能使線程阻塞其自身執(zhí)行的等待函數(shù)WaitForSingleObject、WaitForMultipleObject。線程終結(jié)Win32多線程的實(shí)現(xiàn)下面這個(gè)程序首先創(chuàng)建兩個(gè)線程,當(dāng)輸入為1時(shí),執(zhí)行線程,否則掛起線程。#include
<windows.h>#include
<iostream>using
namespace
std;DWORD
WINAPIFunOne(LPVOIDparam){while(true){Sleep(1000);o!
";cout<<"}return0;}DWORD
WINAPI
FunTwo(LPVOID
param){while(true){Sleep(1000);cout<<"world!
";}return
0;}Win32多線程的實(shí)現(xiàn)(續(xù))int
main(int
argc,
char*
argv[]){int
input=0;HANDLE
hand1=CreateThread
(NULL,
0,
FunOne,
(void*)&input,CREATE_SUSPENDED,
NULL);HANDLEhand2=CreateThread
(NULL,
0,
FunTwo,
(void*)&input,
CREATE_SUSPENDED,
NULL);while(true){cin>>input;if(input==1){ResumeThread(hand1);ResumeThread(hand2);}else{SuspendThread(hand1);SuspendThread(hand2);}};TerminateThread(hand1,1);TerminateThread(hand2,1);return
0;}線程執(zhí)行和資源存取線程之間通信的兩個(gè)基本問(wèn)題是互斥和同步線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的消息,當(dāng)它沒有得到另一個(gè)線程的消息時(shí)應(yīng)該等待,直到消息到達(dá)時(shí)才被喚醒。線程互斥是指對(duì)于共享資源,在各線程Win32線程同步的實(shí)現(xiàn)全局變量事件(Event)臨界區(qū)(Critical
section)互斥量(Mutex)信號(hào)量(Semaphore)時(shí)的排它性。Win32線程同步的實(shí)現(xiàn)全局變量進(jìn)程中的所有線程均可以 所有的全局變量,因而全局變量成為Win32多線程通信的最簡(jiǎn)單方式。事件事件(Event)是WIN32提供的最靈活的線程間同步方式。事件存在兩種狀態(tài):激發(fā)狀態(tài)(signaled
or
true)未激發(fā)狀態(tài)(unsignal
or
false)事件可分為兩類:手動(dòng)設(shè)置:這種對(duì)象只能用程序來(lái)手動(dòng)設(shè)置,在需要該事件或者事件發(fā)生時(shí),采用SetEvent及ResetEvent來(lái)進(jìn)行設(shè)置。自動(dòng)恢復(fù):一旦事件發(fā)生并被處理后,自動(dòng)恢復(fù)到?jīng)]有事件狀態(tài),不需要再次設(shè)置。Win32線程同步的實(shí)現(xiàn)(續(xù))臨界區(qū)一種防止多個(gè)線程同時(shí)執(zhí)行一個(gè)特定代碼段的機(jī)制適用于多個(gè)線程操作之間沒有先后順序但要求互斥的同步。多個(gè)線程
同一個(gè)臨界區(qū)的原則:一次最多只能一個(gè)線程停留在臨界區(qū)內(nèi)不能讓一個(gè)線程無(wú)限地停留在臨界區(qū)內(nèi),否則其他線程將不能進(jìn)入該臨界區(qū)互斥量通常用于協(xié)調(diào)多個(gè)線程或進(jìn)程的活動(dòng),通過(guò)“鎖定”和“取消鎖定”資源,控制對(duì)共享資源的
。信號(hào)量信號(hào)量是一個(gè)
對(duì)象,擁有一個(gè)計(jì)數(shù)器,可用來(lái)管理大量有限的系統(tǒng)資源。當(dāng)計(jì)數(shù)值大于零時(shí),信號(hào)量為有信號(hào)狀態(tài);當(dāng)計(jì)數(shù)值為零時(shí),信號(hào)量處于無(wú)信號(hào)狀態(tài)。MFC線程同步的實(shí)現(xiàn)AfxBeginThread()來(lái)創(chuàng)建一個(gè)CWinThread對(duì)象。CWinThread::CreateThread()函數(shù)用來(lái)啟動(dòng)新的線程MFC同步類某個(gè)對(duì)象的同某個(gè)對(duì)象的同步CCriticalSection
只允許當(dāng)前進(jìn)程中的一個(gè)線程步類CMutes
只允許系統(tǒng)中一個(gè)進(jìn)程內(nèi)的一個(gè)線程類某個(gè)對(duì)象CSymaphore
只允許一到某個(gè)指定數(shù)目個(gè)線程同時(shí)的同步類CEvent
當(dāng)某個(gè)事件發(fā)生時(shí)通知一個(gè)應(yīng)用程序的同步類.Net
Framework線程同步的實(shí)現(xiàn)創(chuàng)建輔助(或從屬)線程的第一個(gè)步驟是創(chuàng)建
ThreadStart
,指定要由該線程執(zhí)行的線程函數(shù)。然后將
ThreadStart
傳遞給Thread
類的構(gòu)造函數(shù)。ThreadStart
starter
=
new
ThreadStart(MyFunction);Thread
t
=new
Thread(starter);t.Start();線程創(chuàng)建好后,可以使用Thread類下的方法對(duì)線程進(jìn)行控制:.NETframework提供了很多的類和數(shù)據(jù)類型來(lái)控制對(duì)共享資源的
。Resume繼續(xù)已掛起的線程。Sleep已重載。將當(dāng)前線程阻塞指定的毫秒數(shù)。Suspend掛起線程,或者如果線程已掛起,則不起作用。Abort調(diào)用此方法通常會(huì)終止線程。OpenMP多線程編程及性能優(yōu)化OpenMP編程簡(jiǎn)介一種面向共享內(nèi)存以及分布式共享內(nèi)存的多處理器多線程并行編程語(yǔ)言。一種能夠被用于顯示指導(dǎo)多線程、共享內(nèi)存并行的應(yīng)用程序編程接口(API)。OpenMP具有良好的可移植性,支持多種編程語(yǔ)言O(shè)penMP能夠支持多種平臺(tái),包括大多數(shù)的類UNIX系統(tǒng)以及WindowsNT系統(tǒng)(Windows2000,Windows
XP,Windows
Vista等)。OpenMP多線程編程基礎(chǔ)OpenMP的編程模型以線程為基礎(chǔ),通過(guò)編譯指提供了導(dǎo)語(yǔ)句來(lái)顯示地指導(dǎo)并行化,為編程對(duì)并行化的完整的控制。采用Fork-Join的形式MasterThreadParalllRegionNestedParallelRegion(續(xù))編譯指導(dǎo)語(yǔ)句在編譯器編譯程序的時(shí)候,會(huì)識(shí)別特定的注釋,而這些特定的注釋就包含著OpenMP程序的一些語(yǔ)義。#pragma
omp
<directive>
[clause[
[,]
clause]…]其中directive部分就包含了具體的編譯指導(dǎo)語(yǔ)句,包括parallel,
for,
parallelfor,
section,
sections,
single,
master,
critical,flush,
ordered和atomic。將串行的程序逐步地改造成一個(gè)并行程序,達(dá)到增量更新程序的目的,減少程序編寫
一定的負(fù)擔(dān)。運(yùn)行時(shí)庫(kù)函數(shù)OpenMP運(yùn)行時(shí)函數(shù)庫(kù)原本用以設(shè)置和獲取執(zhí)行環(huán)境相關(guān)的信息,它們當(dāng)中也包含一系列用以同步的API。支持運(yùn)行時(shí)對(duì)并行環(huán)境的改變和優(yōu)化,給編程
足夠的靈活性來(lái)控制運(yùn)行時(shí)的程序運(yùn)行狀況。使用Visual
Studio
2005編寫OpenMP程序當(dāng)前的Visual
Studio
.Net2005完全支持OpenMP
2.0標(biāo)準(zhǔn),通過(guò)新的編譯器選項(xiàng)/openmp來(lái)支持OpenMP程序的編譯和
。使用Visual
Studio
2005編寫OpenMP程序(續(xù))#include
“stdafx.h”#include
“omp.h”int
_tmain(int
argc,
_TCHAR*
argv[]){printf(“ ofromserial.\n”);printf(“Thread
number
=
%d\n”,omp_get_thread_num());
//串行執(zhí)行#pragma
omp
parallel //開始并行執(zhí)行{printf(“
o
from
parallel.
Thread
number=%d\n”,omp_get_thread_num());}printf(“return0;}o
from
serial
again.\n”);使用Visual
Studio
2005編寫OpenMP程序(續(xù)2)OpenMP程序使用到的環(huán)境變量OMP_NUM_THREADS設(shè)置為4三次執(zhí)行的結(jié)果OpenMP編程技術(shù)——循環(huán)并行化循環(huán)并行化編譯指導(dǎo)語(yǔ)句的格式#pragma
omp
parallel
for
[clause[clause…]]for(
index
= ;
test_expression
;
increment_expr){body
of
the
loop;}循環(huán)并行化語(yǔ)句的限制循環(huán)并行化的語(yǔ)句必須具有如下的形式for
(index=start
;
index<end
;
increment_expr)循環(huán)語(yǔ)句塊應(yīng)該是單出口與單
的循環(huán)嵌套循環(huán)并行化編譯指導(dǎo)語(yǔ)句可以加在任意一個(gè)循環(huán)之前,
則對(duì)應(yīng)的最近的循環(huán)語(yǔ)句被并行化,其他部分保持不變。OpenMP編程技術(shù)——并行區(qū)域編程通過(guò)循環(huán)并行化編譯指導(dǎo)語(yǔ)句使得一段代碼能夠在多個(gè)線程
同時(shí)執(zhí)行。并行區(qū)域編譯指導(dǎo)語(yǔ)句的格式與使用限制#pragma
omp
parallel
[clause[clause]…]blockparallel編譯指導(dǎo)語(yǔ)句的執(zhí)行過(guò)程#pragma
omp
parallelfor(int
i=0;i<5;i++)printf(" o
worldi=%d\n",i);程序的執(zhí)行結(jié)果:oworldi=0oworld
i=1oworldi=2oworldi=3oworldi=4#pragma
omp
parallel
forfor(int
i=0;i<5;i++)printf(" o
worldi=%d\n",i);程序的執(zhí)行結(jié)果:oworldi=0oworldi=3oworldi=1oworldi=4oworldi=2OpenMP編程技術(shù)——并行區(qū)域編程(續(xù))線程私有數(shù)據(jù)與thre
rivate,copyin子句使用thre
rivate子句用來(lái)標(biāo)明某一個(gè)變量是線程私有數(shù)據(jù),在程序運(yùn)行的過(guò)程中,不能夠被其他線程
到。使用copyin子句對(duì)線程私有的全局變量進(jìn)行初始化。int
counter=0;//using
thre
rivate#pragma
omp
threrivate(counter)void
inc_counter(){counter++;}int
_tmain(int
argc,
TCHAR
*
argv[]){#pragma
omp
parallelfor(int
i=0;i<10000;i++)inc_counter();printf("counter=%d\n",counter);}int
global=0;#pragma
omp
thre
rivate(global)int
_tmain(int
argc,
TCHAR
*
argv[]){global=1000;#pragma
omp
parallel
copyin(global){printf("global=%d\n",global);global=omp_get_thread_num();}printf("global=%d\n",global);printf("parallel
again\n");#pragma
omp
parallelprintf("global=%d\n",global);}OpenMP編程技術(shù)——并行區(qū)域編程(續(xù)2)并行區(qū)域之間的工作共享工作隊(duì)列工作隊(duì)列的基本工作過(guò)程即為維持一個(gè)工作的隊(duì)列,線程在并行執(zhí)行的時(shí)候,不斷從這個(gè)隊(duì)列中取出相應(yīng)的工作完成,直到隊(duì)列為空為止。根據(jù)線程號(hào)分配任務(wù)由于每一個(gè)線程在執(zhí)行的過(guò)程中的線程標(biāo)識(shí)號(hào)是不同的,可以根據(jù)這個(gè)線程標(biāo)識(shí)號(hào)來(lái)分配不同的任務(wù)。使用循環(huán)語(yǔ)句分配任務(wù)#pragma
omp
parallel{printf("outside
loop
thread=%d\n",omp_get_thread_num());#pragma
omp
forfor(int
i=0;i<4;i++)printf("inside
loop
i=%d
thread=%d\n",i,omp_get_thread_num();}OpenMP編程技術(shù)——并行區(qū)域編程(續(xù)3)工作分區(qū)編碼(sections)#pragma
omp
parallel
sections{#pragma
omp
sectionprintf("section
1
thread=%d\n",omp_get_thread_num());#pragma
omp
sectionprintf("section
2
thread=%d\n",omp_get_thread_num());#pragma
omp
sectionprintf("sectino
3
thread=%d\n",omp_get_thread_num());}程序運(yùn)行結(jié)果為:section1
thread=0section2
thread=1sectino3
thread=0OpenMP線程同步OpenMP支持兩種不同類型的線程同步機(jī)制互斥鎖事件通知機(jī)制數(shù)據(jù)競(jìng)爭(zhēng)int
i;
int
max_num=-1;#pragma
omp
parallel
forfor(i=0;i<n;i++)if(ar[i]>max_num)max_num=ar[i];互斥鎖機(jī)制在OpenMP中,提供了三種不同的互斥鎖機(jī)制用來(lái)對(duì)一塊內(nèi)存進(jìn)行保護(hù),它們分別是臨界區(qū)(critical),原子操作(atomic)以及由庫(kù)函數(shù)來(lái)提供同步操作。OpenMP線程同步——臨界區(qū)在程序需要
可能產(chǎn)生競(jìng)爭(zhēng)的內(nèi)存數(shù)據(jù)的時(shí)候,都需要相應(yīng)的臨界區(qū)代碼。臨界區(qū)編譯指導(dǎo)語(yǔ)句的格式如下所示:#pragma
omp
critical
[(name)]blockinti;
int
max_num_x=max_num_y=-1;#pragma
omp
parallel
forfor(i=0;i<n;i++){#pragma
omp
critical
(max_arx)if(arx[i]>max_num_x)max_num_x=arx[i];#pragma
omp
critical
(max_ary)if(ary[i]>max_num_y)max_num_y=ary[i];}OpenMP線程同步——原子操作原子操作是OpenMP編程方式給同步編程帶來(lái)的特殊的編程功能,通過(guò)編譯指導(dǎo)語(yǔ)句的方式直接獲取了現(xiàn)在多處理器計(jì)算機(jī)體系結(jié)構(gòu)的功能。通過(guò)#pragma
omp
atomic編譯指
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人健身房設(shè)備租賃合同(2024版)3篇
- 2025版仲裁申請(qǐng)書行政公文范本制作與培訓(xùn)服務(wù)合同2篇
- 2025版論行政合同中行政主體權(quán)益保護(hù)與義務(wù)履約4篇
- 2024版商業(yè)房產(chǎn)銷售合同條款樣本
- 2025年度文化創(chuàng)意產(chǎn)業(yè)園區(qū)土地承包協(xié)議范本4篇
- 2025年度茶葉行業(yè)人才培訓(xùn)與就業(yè)合作合同4篇
- 二零二五年方管行業(yè)質(zhì)量標(biāo)準(zhǔn)制定合同3篇
- 2025年度智能家居系統(tǒng)瓷磚采購(gòu)合同協(xié)議書4篇
- 專利技術(shù)成果應(yīng)用許可合同2024版一
- 二零二五年度裝配式建筑構(gòu)件設(shè)計(jì)、制造與施工合同3篇
- 寒潮雨雪應(yīng)急預(yù)案范文(2篇)
- 垃圾車駕駛員聘用合同
- 變壓器搬遷施工方案
- 單位轉(zhuǎn)賬個(gè)人合同模板
- 八年級(jí)語(yǔ)文下冊(cè) 成語(yǔ)故事 第十五課 諱疾忌醫(yī) 第六課時(shí) 口語(yǔ)交際教案 新教版(漢語(yǔ))
- 2024年1月高考適應(yīng)性測(cè)試“九省聯(lián)考”數(shù)學(xué) 試題(學(xué)生版+解析版)
- EPC項(xiàng)目采購(gòu)階段質(zhì)量保證措施
- T-NAHIEM 101-2023 急診科建設(shè)與設(shè)備配置標(biāo)準(zhǔn)
- 四川2024年專業(yè)技術(shù)人員公需科目“數(shù)字經(jīng)濟(jì)與驅(qū)動(dòng)發(fā)展”參考答案(通用版)
- 煤炭裝卸服務(wù)合同
- 廣東省佛山市順德區(qū)2023學(xué)年中考一模物理試題(含答案解析)
評(píng)論
0/150
提交評(píng)論