多核程序设计课件5windows多线程编程.ppt
- 文档编号:1737174
- 上传时间:2022-10-23
- 格式:PPT
- 页数:69
- 大小:387KB
多核程序设计课件5windows多线程编程.ppt
《多核程序设计课件5windows多线程编程.ppt》由会员分享,可在线阅读,更多相关《多核程序设计课件5windows多线程编程.ppt(69页珍藏版)》请在冰豆网上搜索。
第四章Windows多线程编程及调优,浙江大学计算机学院,Windows多线程API,在Windows平台下可以通过Windows的线程库来实现多线程编程提供的接口Win32API或MFC.NetFramework实现方式的多样化给Windows编程带来了很大的灵活性也使得多线程编程变得复杂,Windows线程库,Win32APIWindows操作系统为内核以及应用程序之间提供的接口将内核提供的功能进行函数封装应用程序通过调用相关的函数获得相应的系统功能。
MFC微软基础函数类库(MicrosoftFoundationClasses)用类库的方式将Win32API进行封装,以类的方式提供.NETFramework构成公共语言运行库(CommonLanguageRuntime,CLR)文件加载器、垃圾收集器、安全系统Framework类库(FrameworkClassLibrary,FCL).NET基础类库的System.Threading命名空间提供了大量的类和接口来支持多线程所有与多线程机制相关的类都存放在System.Threading命名空间中,使用win32线程API,Win32函数库中提供了操作多线程的函数,包括创建线程、管理线程、终止线程、线程同步等接口。
提供操作系统级别的创建线程的操作线程函数DWORDWINAPIThreadFunc(LPVOIDlpvThreadParm);线程创建HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,SIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);,第一个参数lpThreadAtt,是一个指向SECURITY-ATTRIBUTES结构的指针,该结构制定了线程的安全属性,缺省为NULL。
第二个参数dwStackSize,是栈的大小,一般设置为0。
第三个参数LPTHREAD_START_ROUTINE是新线程开始执行时,线程函数的入口地址。
它必须是将要被新线程执行的函数地址,不能为NULL。
lpStartAddress参数指定了线程函数的地址,新建线程将从此地址开始执行,直到return语句返回,线程运行结束,把控制权交给操作系统。
第四个参数lpParameter,是线程函数定义的参数。
可以通过这个参数传送值,包括指针或者NULL。
第五个参数dwCreationFlags,控制线程创建的附加标志,可以设置两种值。
0表示线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;第六个参数lpThreadID,为指向32位变量的指针,该参数接受所创建线程的ID号。
如果创建成功则返回线程的句柄,否则返回NULL。
_beginthread,创建线程还可以用process.h头文件中声明的C执行时期链接库函数_beginthread。
在回调入口函数之前进行一些线程相关的CRT的初始化操作语法:
hThread=_beginthread(void(_cdecl*start_address)(void*),unsignedstack_size,void*arglist);线程函数的语法:
void_cdeclThreadProc(void*pParam);,使用_beginthread创建线程的例子,#includestdafx.h#include#include#include#includeusingnamespacestd;voidThreadFunc1(PVOIDparam)while
(1)Sleep(1000);coutThisisThreadFunc1endl;voidThreadFunc2(PVOIDparam)while
(1),Sleep(1000);coutThisisThreadFunc2endl;intmain()inti=0;_beginthread(ThreadFunc1,0,NULL);_beginthread(ThreadFunc2,0,NULL);Sleep(3000);coutendendl;return0;,线程管理,设置线程的优先级一个线程被创建时,它的优先级等于它所属进程的优先级SetThreadPriority函数设置线程的相对优先级BoolSetThreadPriority(HANDLEhPriority,intnPriority)线程与包含它的进程的优先级关系如下:
线程优先级=进程优先级+线程相对优先级,设置线程的优先级,参数hPriority是指向待设置的线程句柄进程的优先级包括:
实时:
REALTIME_PRIORITY_CLASS;高:
HIGH_PRIORITY_CLASS;高于正常:
ABOVE_NORMAL_PRIORITY_CLASS;正常:
NORMAL_PRIORITY_CLASS;低于正常:
BELOW_NORMAL_PRIORITY_CLASS;空闲:
IDLE_PRIORITY_CLASS。
nPriority是线程的相对优先级,可以是以下的值:
最高线程:
THREAD-PRIORITY-HIGHEST-2空闲:
THREAD-PRIORITY-IDLE15最低线程:
THREAD-PRIORITY-LOWEST2低于正常线程:
THREAD-PRIORITY-BELOW-NORMAL1正常线程:
THREAD-PRIORITY-NORMAL0高于正常线程:
THREAD-PRIORITY-ABOVENORMAL-1关键时间:
THREAD-PRIORITY-TIMECRITICAL-15,线程的挂起与恢复,进程中的每个线程都有挂起计数器(suspendcount)当挂起计数器值为0时,线程被执行当挂起计数器值大于0时,调度器不去调度该线程。
不能够直接访问线程的挂起计数器挂起DWORDSuspendThread(HANDLEhThread);恢复DWORDResumeThread(HANDLEhThread);原型DWORDSuspendThread(HANDLEhThread);挂起指定的线程如果函数执行成功,则线程的执行被终止每次调用SuspendThread()函数,线程将挂起计数器的值增1DWORDResumeThread(HANDLEhThread);结束线程的挂起状态来执行这个线程每次调用ResumeThread()函数,线程将挂起计数器的值减1若挂起计数器的值为0,则不会再减,线程等待,一组能使线程阻塞其自身执行的等待函数WaitForSingleObjectWaitForMultipleObject在其参数中的一个或多个同步对象产生了信号,或者超过规定的等待时间才会返回在等待函数未返回时,线程处于等待状态,线程只消耗很少的CPU时间,线程终结,在线程函数返回时,线程自动终止在线程的执行过程中终止则可调用函数:
VOIDExitThread(DWORDdwExitCode);deallocate栈;取消I/O;结束线程如果在线程的外面终止线程,则可调用下面的函数:
BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);,Win32多线程的实现,下面这个程序首先创建两个线程,当输入为1时,执行线程,否则挂起线程。
#include#includeusingnamespacestd;DWORDWINAPIFunOne(LPVOIDparam)while(true)Sleep(1000);couthello!
;,return0;DWORDWINAPIFunTwo(LPVOIDparam)while(true)Sleep(1000);coutworld!
;return0;,Win32多线程的实现(续),intmain(intargc,char*argv)intinput=0;HANDLEhand1=CreateThread(NULL,0,FunOne,(void*),线程执行和资源存取,线程之间通信的两个基本问题是互斥和同步线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应该等待,直到消息到达时才被唤醒。
线程互斥是指对于共享资源,在各线程访问时的排它性线程互斥是一种特殊的线程同步Win32线程同步的实现全局变量事件(Event)临界区(Criticalsection)互斥量(Mutex)信号量(Semaphore),Win32线程同步的实现-全局变量,全局变量进程中的所有线程均可以访问所有的全局变量,因而全局变量成为Win32多线程通信的最简单方式。
intvar;/全局变量UINTThreadFunction(LPVOIDpParam)while(var)/线程处理return0;var是一个全局变量,任何线程均可以访问和修改。
线程间可以利用此特性达到线程同步的目的。
用全局变量同步线程的例子,#include#includeusingnamespacestd;intglobalvar=false;DWORDWINAPIThreadFunc(LPVOIDpParam)coutThreadFuncendl;Sleep(200);globalvar=true;return0;问题:
主线程等待globalvar为真,如不为真则一直循环,这样占用了CPU资源如果主线程优先级高于ThreadFunc,则globalvar一直不会被置为真,intmain()HANDLEhthread=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);if(!
hthread)coutThreadCreateError!
endl;CloseHandle(hthread);while(!
globalvar)coutThreadwhileendl;coutThreadexitendl;return0;,事件,事件(Event)是WIN32提供的最灵活的线程间同步方式用来发送命令或触发事件,安排事件执行的先后次序事件存在两种状态:
激发状态(signaledortrue)未激发状态(unsignalorfalse)事件可分为两类:
手动设置这种对象只能用程序来手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
自动恢复一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。
自动重置事件被设置为激发状态后,会唤醒“一个”等待中的线程,然后自动恢复为未激发状态,原型为:
HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,BOOLbInitialState,LPCTSTRlpName);其中:
第一个参数:
与CreateThread中的第一个参数类似,是一个指向SECURITY-ATTRIBUTES结构的指针第二个参数:
代表事件的类型,是手动清除事件信号还是自动清除事件信号。
TRUE为手动清除。
第三个参数:
指明事件的初始状态第四个参数:
事件的名称,使用“事件”机制注意事项,
(1)设置事件是否要自动恢复;
(2)设置事件的初始状态;(3)如果跨进程访问事件,必须对事件命名,在对事件命名的时候,要注意不要与系统命名空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多核 程序设计 课件 windows 多线程 编程