下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Multicore
ProgrammingInstructor:
Zhang
Weizhe
(
)Computer
Network
and
Information
Security
TechniqueResearch
Center
,
School
of
Computer
Science
andTechnology,
Harbin
Institute
of
TechnologyWindows多线程编程及调优Windows线程库介绍Win32API是Windows操作系统为内核以及应用程序之间提供的接口,将内核提供的功能进行函数封装,应用程序通过调用相关的函数获得相应的系统功能。MFC是微软基础函数类库(
FoundationClasses),由微软提供的,用类库的方式将Win32API进行封装,
以类的方式提供给开发者。.NET
Framework
由两部分构成:公共语言运行库(Common
LanguageRuntime
,CLR)和Framework类库(Framework
Class
Library
,FCL)。.NET基础类库的System.Threading命名空间提供了大量的类和接口来支持多线程。所有与多线程机制相关的类都存放在System.Threading命名空间中。使用win32线程APIWin32函数库中提供了操作多线程的函数,包括创建线程、管理线程、终止线程、线程同步等接口。线程函数arm);DWORD
WINAPI
ThreadFunc
(LPVOID
lpvThre线程创建HANDLE
CreateThread
(LPSECURITY_ATTRIBUTES
lpThreadAttributes,SIZE_T
dwStackSize,LPTHREAD_START_ROUTINE
lpStartAddress,LPVOID
lpParameter,DWORD
dwCreationFlags,LPDWORD
lpThreadId);线程管理设置线程的优先级线程优先级=进程优先级+线程相对优先级Bool
SetThre riority
(HANDL
E
hPriority
,
int
nPriority)线程的挂起与恢复进程中的每个线程都有挂起计数器(suspendcount)
。当挂起计数器值为0时,线程被执行;当挂起计数器值大于0时,调度器不去调度该线程。DWORD
SuspendThread(HANDLE
hThread);DWORD
ResumeThread(HANDLE
hThread);线程等待一组能使线程阻塞其自身执行的等待函数WaitForSingleObject、WaitForMultipleObject。线程终结Win32多线程的实现下面这个程序首先创建两个线程,当输入为1时,执行线程,否则挂起线程。#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多线程的实现(续)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;}线程执行和资源存取线程之间通信的两个基本问题是互斥和同步线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应该等待,直到消息到达时才被唤醒。线程互斥是指对于共享资源,在各线程Win32线程同步的实现全局变量事件(Event)临界区(Critical
section)互斥量(Mutex)信号量(Semaphore)时的排它性。Win32线程同步的实现全局变量进程中的所有线程均可以 所有的全局变量,因而全局变量成为Win32多线程通信的最简单方式。事件事件(Event)是WIN32提供的最灵活的线程间同步方式。事件存在两种状态:激发状态(signaled
or
true)未激发状态(unsignal
or
false)事件可分为两类:手动设置:这种对象只能用程序来手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。Win32线程同步的实现(续)临界区一种防止多个线程同时执行一个特定代码段的机制适用于多个线程操作之间没有先后顺序但要求互斥的同步。多个线程
同一个临界区的原则:一次最多只能一个线程停留在临界区内不能让一个线程无限地停留在临界区内,否则其他线程将不能进入该临界区互斥量通常用于协调多个线程或进程的活动,通过“锁定”和“取消锁定”资源,控制对共享资源的
。信号量信号量是一个
对象,拥有一个计数器,可用来管理大量有限的系统资源。当计数值大于零时,信号量为有信号状态;当计数值为零时,信号量处于无信号状态。MFC线程同步的实现AfxBeginThread()来创建一个CWinThread对象。CWinThread::CreateThread()函数用来启动新的线程MFC同步类某个对象的同某个对象的同步CCriticalSection
只允许当前进程中的一个线程步类CMutes
只允许系统中一个进程内的一个线程类某个对象CSymaphore
只允许一到某个指定数目个线程同时的同步类CEvent
当某个事件发生时通知一个应用程序的同步类.Net
Framework线程同步的实现创建辅助(或从属)线程的第一个步骤是创建
ThreadStart
,指定要由该线程执行的线程函数。然后将
ThreadStart
传递给Thread
类的构造函数。ThreadStart
starter
=
new
ThreadStart(MyFunction);Thread
t
=new
Thread(starter);t.Start();线程创建好后,可以使用Thread类下的方法对线程进行控制:.NETframework提供了很多的类和数据类型来控制对共享资源的
。Resume继续已挂起的线程。Sleep已重载。将当前线程阻塞指定的毫秒数。Suspend挂起线程,或者如果线程已挂起,则不起作用。Abort调用此方法通常会终止线程。OpenMP多线程编程及性能优化OpenMP编程简介一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。一种能够被用于显示指导多线程、共享内存并行的应用程序编程接口(API)。OpenMP具有良好的可移植性,支持多种编程语言OpenMP能够支持多种平台,包括大多数的类UNIX系统以及WindowsNT系统(Windows2000,Windows
XP,Windows
Vista等)。OpenMP多线程编程基础OpenMP的编程模型以线程为基础,通过编译指提供了导语句来显示地指导并行化,为编程对并行化的完整的控制。采用Fork-Join的形式MasterThreadParalllRegionNestedParallelRegion(续)编译指导语句在编译器编译程序的时候,会识别特定的注释,而这些特定的注释就包含着OpenMP程序的一些语义。#pragma
omp
<directive>
[clause[
[,]
clause]…]其中directive部分就包含了具体的编译指导语句,包括parallel,
for,
parallelfor,
section,
sections,
single,
master,
critical,flush,
ordered和atomic。将串行的程序逐步地改造成一个并行程序,达到增量更新程序的目的,减少程序编写
一定的负担。运行时库函数OpenMP运行时函数库原本用以设置和获取执行环境相关的信息,它们当中也包含一系列用以同步的API。支持运行时对并行环境的改变和优化,给编程
足够的灵活性来控制运行时的程序运行状况。使用Visual
Studio
2005编写OpenMP程序当前的Visual
Studio
.Net2005完全支持OpenMP
2.0标准,通过新的编译器选项/openmp来支持OpenMP程序的编译和
。使用Visual
Studio
2005编写OpenMP程序(续)#include
“stdafx.h”#include
“omp.h”int
_tmain(int
argc,
_TCHAR*
argv[]){printf(“ ofromserial.\n”);printf(“Thread
number
=
%d\n”,omp_get_thread_num());
//串行执行#pragma
omp
parallel //开始并行执行{printf(“
o
from
parallel.
Thread
number=%d\n”,omp_get_thread_num());}printf(“return0;}o
from
serial
again.\n”);使用Visual
Studio
2005编写OpenMP程序(续2)OpenMP程序使用到的环境变量OMP_NUM_THREADS设置为4三次执行的结果OpenMP编程技术——循环并行化循环并行化编译指导语句的格式#pragma
omp
parallel
for
[clause[clause…]]for(
index
= ;
test_expression
;
increment_expr){body
of
the
loop;}循环并行化语句的限制循环并行化的语句必须具有如下的形式for
(index=start
;
index<end
;
increment_expr)循环语句块应该是单出口与单
的循环嵌套循环并行化编译指导语句可以加在任意一个循环之前,
则对应的最近的循环语句被并行化,其他部分保持不变。OpenMP编程技术——并行区域编程通过循环并行化编译指导语句使得一段代码能够在多个线程
同时执行。并行区域编译指导语句的格式与使用限制#pragma
omp
parallel
[clause[clause]…]blockparallel编译指导语句的执行过程#pragma
omp
parallelfor(int
i=0;i<5;i++)printf(" o
worldi=%d\n",i);程序的执行结果:oworldi=0oworld
i=1oworldi=2oworldi=3oworldi=4#pragma
omp
parallel
forfor(int
i=0;i<5;i++)printf(" o
worldi=%d\n",i);程序的执行结果:oworldi=0oworldi=3oworldi=1oworldi=4oworldi=2OpenMP编程技术——并行区域编程(续)线程私有数据与thre
rivate,copyin子句使用thre
rivate子句用来标明某一个变量是线程私有数据,在程序运行的过程中,不能够被其他线程
到。使用copyin子句对线程私有的全局变量进行初始化。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编程技术——并行区域编程(续2)并行区域之间的工作共享工作队列工作队列的基本工作过程即为维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完成,直到队列为空为止。根据线程号分配任务由于每一个线程在执行的过程中的线程标识号是不同的,可以根据这个线程标识号来分配不同的任务。使用循环语句分配任务#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编程技术——并行区域编程(续3)工作分区编码(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());}程序运行结果为:section1
thread=0section2
thread=1sectino3
thread=0OpenMP线程同步OpenMP支持两种不同类型的线程同步机制互斥锁事件通知机制数据竞争int
i;
int
max_num=-1;#pragma
omp
parallel
forfor(i=0;i<n;i++)if(ar[i]>max_num)max_num=ar[i];互斥锁机制在OpenMP中,提供了三种不同的互斥锁机制用来对一块内存进行保护,它们分别是临界区(critical),原子操作(atomic)以及由库函数来提供同步操作。OpenMP线程同步——临界区在程序需要
可能产生竞争的内存数据的时候,都需要相应的临界区代码。临界区编译指导语句的格式如下所示:#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编程方式给同步编程带来的特殊的编程功能,通过编译指导语句的方式直接获取了现在多处理器计算机体系结构的功能。通过#pragma
omp
atomic编译指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 亲子沟通感受50字
- 《东乡族舞蹈现状与传承路径研究》
- 《科技金融对区域经济高质量增长的影响研究》
- 二零二四年车库门行业标准制定合同
- 养殖鸭合同范本
- 《电镀污泥中回收镍的工艺优化研究》
- 《河南省新型城镇化和农业现代化的协调发展研究》
- 2024年度企业销售业绩奖金合同规定
- 中班月计划安全教育
- 2024版智能物流系统开发与许可合同
- 气体检测报警仪的检定校准
- 六年级上册数学课件-7.5 牛吃草问题丨苏教版 (共13张PPT)
- 六年级上册数学课件-6.1 认识百分数丨苏教版 (共18张PPT)
- 肠痈(阑尾炎)中医护理方案教学课件
- 种植体基础知识-课件
- 工程维修派工单格式
- 木结构设计规范
- 建筑文化-窑洞民居
- 电子公章模板
- 五年级上册数学课件- 6.4组合图形的面积 |人教版 (共17张PPT)
- 四年级英语上册课件-Unit 4 My home Lets learn -人教PEP版(共20张PPT)
评论
0/150
提交评论