并行计算与多核程序设计

上传人:第*** 文档编号:38888261 上传时间:2018-05-09 格式:DOC 页数:6 大小:46KB
返回 下载 相关 举报
并行计算与多核程序设计_第1页
第1页 / 共6页
并行计算与多核程序设计_第2页
第2页 / 共6页
并行计算与多核程序设计_第3页
第3页 / 共6页
并行计算与多核程序设计_第4页
第4页 / 共6页
并行计算与多核程序设计_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《并行计算与多核程序设计》由会员分享,可在线阅读,更多相关《并行计算与多核程序设计(6页珍藏版)》请在金锄头文库上搜索。

1、 第四章 Windows 多线程编程及调优-web 课件返回 在 Windows 平台下可以通过 Windows 的线程库来实现多线程编程,可以利用 Win32 API 或 MFC 以及.Net Framework 提供的接口来实现。实现方式的多样化给 Windows 编程带来了很大的灵活性,但也使得多线程编程变得复杂。对于多线程的程序我们可以使用 Visual Studio 调试工具进行调试,也可以使用多核芯片厂家的线程分析与调试工具进行调试及优化。Windows 线程库介绍线程库介绍Win32 API 是 Windows 操作系统为内核以及应用程序之间提供的接口,将内核提供的功能进行函数封

2、装,应用程序通过调用相关的函数获得相应的系统功能。Win32 API 提供了一系列处理线程的函数接口,来向应用程序提供多线程的功能。MFC 是微软基础函数类库(Microsoft Foundation Classes),由微软提供的,用类库的方式将 Win32 API 进行封装, 以类的方式提供给开发者。在 MFC 类库中,提供了对多线程的支持。由于 MFC 是在 Win32 API 基础之上进行封装的,其基本原理与 Win32 API 的基本实现原理很类似。MFC对同步对象作了封装,因此对用户编程实现来说更加方便。.NET Framework 由两部分构成:公共语言运行库(Common La

3、nguage Runtime ,CLR)和 Framework 类库(Framework Class Library ,FCL)。CLR 包括自己的文件加载器、垃圾收集器、安全系统等。CRL 提供了一个可靠而完善的多语言运行环境。CLR 是一个软件引擎,用于加载应用程序、检查错误、进行安全许可认证、执行和清空内存。Framework 类库提供了所有应用程序模型都要使用的一个面向对象的 API 集合。.NET 基础类库的 System.Threading 命名空间提供了大量的类和接口来支持多线程。所有与多线程机制相关的类都存放在 System.Threading 命名空间中。其中 Thread

4、类用于创建及管理线程,ThreadPool 类用于管理线程池等,此外还提供线程间通讯等实际问题的机制。使用使用 win32 线程线程 API Win32 函数库中提供了操作多线程的函数,包括创建线程、管理线程、终止线程、线程同步等接口。线程必须从一个指定的函数开始执行,该函数称为线程函数,具有如下原型:DWORD WINAPI ThreadFunc (LPVOID lpvThreadParm);线程创建线程创建 创建线程的函数如下:HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,

5、LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );CreateThread 函数中需要传递 6 个参数。下面简单介绍一下这几个参数的用法:第一个参数 lpThreadAtt,是一个指向 SECURITY- ATTRIBUTES 结构的指针,该结构制定了线程的安全属性,缺省为 NULL。第二个参数 dwStackSize,是栈的大小,一般设置为 0。第三个参数 lpFun 是新线程开始执行时,线程函数的入口地址。它必须是将要被新线程执行的函数地

6、址,不能为 NULL。第四个参数 lpParameter,是线程函数定义的参数。可以通过这个参数传送值,包括指针或者 NULL 。第五个参数 dwCreationFlags,控制线程创建的附加标志,可以设置两种值。0 表示线程在被创建后就会立即开始执行;如果该参数为 CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数 ResumeThread 被调用;第六个参数 lpThreadID,为指向 32 位变量的指针,该参数接受所创建线程的 ID 号。如果创建成功则返回线程的句柄,否则返回 NULL。线程管理线程管理(1)设置线程的优先级)设置线程的优先级

7、当一个线程被创建时,它的优先级等于它所属进程的优先级。可以通过调用 SetThreadPriority函数来设置线程的相对优先级。线程的优先级是相对其所属的进程的优先级而言的。例如:Bool SetThreadPriority (HANDLE hPriority , int nPriority) ;参数 hPriority 是指向待设置的线程句柄,线程与包含它的进程的优先级关系如下:线程优先级 = 进程优先级 + 线程相对优先级(2)线程的挂起与恢复)线程的挂起与恢复进程中的每个线程都有挂起计数器(suspend count) 。当挂起计数器值为 0 时,线程被执行;当挂起计数器值大于 0 时

8、,调度器不去调度该线程。不能够直接访问线程的挂起计数器,可以通过调用 Windows API 函数来改变它的值。可以通过调用 SuspendThread()函数来挂起。可以通过调用 ResumeThread()函数来恢复。这两个函数的原型如下:DWORD SuspendThread(HANDLE hThread);该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。每次调用 SuspendThread() 函数,线程将挂起计数器的值增 1 。DWORD ResumeThread(HANDLE hThread);该函数用于结束线程的挂起状态来执行这个线程。每次调用 ResumeThr

9、ead() 函数,线程将挂起计数器的值减 1 ,若挂起计数器的值为 0,则不会再减。(3)线程等待)线程等待 Win32 API 提供了一组能使线程阻塞其自身执行的等待函数 WaitForSingleObject、WaitForMultipleObject。这些函数在其参数中的一个或多个同步对象产生了信号,或者超过规定的等待时间才会返回。在等待函数未返回时,线程处于等待状态,线程只消耗很少的 CPU 时间。最常用的等待函数是: DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); 而函数 WaitForMultipleO

10、bject 可以用来同时监测多个对象,该函数的声明为: DWORD WaitForMultipleObject(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);线程终结线程终结在线程函数返回时,线程自动终止。如果需要在线程的执行过程中终止则可调用函数:VOID ExitThread (DWORD dwExitCode) ;如果在线程的外面终止线程,则可调用下面的函数:BOOL TerminateThread (HANDLE hThread, DWORDdw ExitCode) ;Win32 多线程

11、的实现多线程的实现下面这个程序首先创建两个线程,当输入为 1 时,执行线程,否则挂起线程。例 4.2 简单的多线程创建、执行、挂起、终止的程序例子#include #include using namespace std;DWORD WINAPI FunOne(LPVOID param)while(true)Sleep(1000);coutinput;if(input=1) ResumeThread(hand1);ResumeThread(hand2);else SuspendThread(hand1);SuspendThread(hand2);TerminateThread(hand1,1);TerminateThread(hand2,1);return 0;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号