已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多线程 现代软件开发技术 一 进程简介 进程是一个可执行的程序 由私有虚拟地址空间 代码 数据和其他操作系统资源 如进程创建的文件 管道 同步对象等 组成 进程在运行时创建的资源随着进程的终止而死亡 一个应用程序可以有一个或多个进程 一个进程可以有一个或多个线程 其中一个是主线程 1 独立性进程是系统中独立存在的实体 它可以拥有自己独立的资源 比如文件和设备描述符等 未经进程本身允许 其他进程不能访问到这些资源 2 动态性程序只是一个静态的指令集合 而进程是一个正在系统中活动的指令集合 在进程中加入了时间的概念 进程具有自己的生命周期和各种不同的状态 一 进程简介 进程的三个重要特性 3 并发性 并发行由独立性和动态性衍生而来 若干个进程可以在单处理机状态上并发执行 并发与并行 并行指在同一时刻内 有多条指令在多个处理机上同时执行 并发指在同一时刻内只能有一条指令执行 但多个进程的指令被快速轮换执行 使得在宏观上具有多个进程同时执行的效果 一 进程简介 进程的三个重要特性 一 进程简介 进程状态进程是一个动态的实体 故而它是有生命的 一般来说 所有进程都要经历以下3种状态 就绪 ready 态阻塞 blocked 态运行态 一 进程简介 进程状态就绪态指进程已经获得所有所需的其他资源 并正在申请处理机资源 准备开始运行 阻塞态又称休眠状态或者等待状态 指进程因为需要等待所需资源而放弃处理机 或者进程本不拥有处理机 且其他资源也没有满足 从而即使得到处理机资源也不能开始运行 运行态指进程得到了处理机 不需要等待其他任何资源 正在执行的状态 此时进程才可使用申请的资源 二 进程的创建 调用CreateProcess函数创建新的进程 若进程创建成功的话 返回一个进程信息结构类型的指针 进程信息结构如下 typedefstruct PROCESS INFORMATION HANDLEhProcess HANDLEhThread DWORDdwProcessId DWORDdwThreadId PROCESS INFORMATION 进程信息结构包括进程句柄 主线程句柄 进程ID 主线程ID 三 进程的终止 调用ExitProcess结束进程 进程的主线程返回 隐含地调用ExitProcess导致进程结束 进程的最后一个线程终止 调用TerminateProcess终止进程 当要结束一个GDI进程时 发送WM QUIT消息给主窗口 当然也可以从它的任一线程调用ExitProcess VOIDExitProcess UINTuExitCode exitcodeforallthreads BOOLTerminateProcess HANDLEhProcess handletotheprocessUINTuExitCode exitcodefortheprocess 四 线程的简介 概念一线程是包含在进程中的一种实体 线程有自己的运行线索 可以完成一定的任务 可与其他线程共享进程中的共享变量及部分环境 相互之间协同来完成进程所要完成的任务 概念二线程是操作系统分时调度分配CPU时间的基本实体 一个线程可以执行程序的任意部分的代码 即使这部分代码被另一个线程并发地执行 一个进程的所有线程共享它的虚拟地址空间 全局变量和操作系统资源 四 线程的简介 概念三线程是一个独立的执行流 是进程内部的一个独立的执行单元 相当于一个子程序 它对应VisualC 中的CWinThread类的对象 单独一个执行程序运行时 默认运行包含一个主线程 主线程以函数地址的形式提供程序的启动点 如main或WinMain函数 当主线程终止时 进程也随之终止 但根据需要 应用程序又可以分解成许多独立执行的线程 每个线程并行的运行在同一进程中 四 线程的简介 概念三线程是一个独立的执行流 是进程内部的一个独立的执行单元 相当于一个子程序 它对应VisualC 中的CWinThread类的对象 单独一个执行程序运行时 默认运行包含一个主线程 主线程以函数地址的形式提供程序的启动点 如main或WinMain函数 当主线程终止时 进程也随之终止 但根据需要 应用程序又可以分解成许多独立执行的线程 每个线程并行的运行在同一进程中 共性同一个进程中的线程都有共性 多个线程将共享同一个进程虚拟空间 线程共享的环境包括 进程代码段 进程的公有数据 利用这些共享的数据 线程很容易的实现相互之间的通讯 进程打开的文件描述符 信号的处理器 进程的当前目录和进程用户ID与进程组ID 四 线程的简介 个性 线程实现并发性的必要条件个性线程ID寄存器组的值线程的堆栈错误返回码线程的信号屏蔽码线程的优先级 四 线程的简介 四 线程的简介 线程ID每个线程都有自己的线程ID 这个ID在本进程中是唯一的 寄存器组的值一个线程切换到另一个线程上时 必须将原有的线程的寄存器集合的状态保存 以便将来该线程在被重新切换到时能得以恢复 线程的堆栈线程必须拥有自己的函数堆栈 使得函数调用可以正常执行 不受其他线程的影响错误返回码不同线程应该拥有自己的错误返回码变量 四 线程的简介 线程的信号屏蔽码线程的信号屏蔽码应该由线程自己管理 但所有的线程都共享同样的信号处理器线程的优先级由于线程需要像进程那样能够被调度 那么就必须要有可供调度使用的参数 这个参数就是线程的优先级 四 线程的简介 从调度的角度 线程可以分为用户线程和内核线程 用户线程用户线程的实现是通过运行时间系统代码来实现的 线程的切换实际上并不是核心调度器来实现的 而是通过进程内的代码来实现的 内核线程内核线程切换的实现是通过内核调度器来实现的 内核线程同进程是一样的 都是核心调度器的调度实体 线程的分类 五 线程的管理和操作 1 线程的启动 在MFC程序中创建一个线程 调用AfxBeginThread函数 该函数因参数不同而具有两种重载版本 分别对应工作者线程和用户接口 UI 线程 五 线程的管理和操作 1 工作者线程 CWinThread AfxBeginThread AFX THREADPROCpfnThreadProc 控制函数LPVOIDpParam 传递给控制函数的参数intnPriority THREAD PRIORITY NORMAL 线程的优先级UINTnStackSize 0 线程的堆栈大小DWORDdwCreateFlags 0 线程的创建标志LPSECURITY ATTRIBUTESlpSecurityAttrs NULL 线程的安全属性 五 线程的管理和操作 线程的优先级 THREAD PRIORITY TIME CRITICAL 实时优先级THREAD PRIORITY HIGHEST 比普通优先级高两个单位THREAD PRIORITY ABOVE NORMAL 比普通优先级高一个单位THREAD PRIORITY NORMAL 普通优先级THREAD PRIORITY BELOW NORMAL 比普通优先级低一个单位THREAD PRIORITY LOWEST比普通优先级低两个单位THREAD PRIORITY IDLE 空闲优先级 五 线程的管理和操作 线程的优先级 调用SetThreadPriority函数用于设置线程的优先级 函数声明如下 BOOLSetThreadPriority intnPriority 优先级 五 线程的管理和操作 1 工作者线程 工作者线程编程较为简单 只需编写线程控制函数和启动线程即可 下面的代码给出了定义一个控制函数和启动它的过程 线程控制函数UINTMfcThreadProc LPVOIDlpParam CExampleClass lpObject CExampleClass lpParam if lpObject NULL lpObject IsKindof RUNTIME CLASS CExampleClass return 1 输入参数非法while 1 return0 线程成功启动 在MFC程序中启动线程AfxBeginThread MfcThreadProc lpObject 五 线程的管理和操作 2 UI线程 创建用户界面线程时 必须首先从CWinThread派生类 并使用DECLARE DYNCREATE和IMPLEMENT DYNCREATE宏声明此类 启动UI线程的AfxBeginThread函数的原型为 CWinThread AfxBeginThread 从CWinThread派生的类的RUNTIME CLASSCRuntimeClass pThreadClass intnPriority THREAD PRIORITY NORMAL UINTnStackSize 0 DWORDdwCreateFlags 0 LPSECURITY ATTRIBUTESlpSecurityAttrs NULL 五 线程的管理和操作 2 UI线程 AfxBeginThread参数说明 pThreadClass是从CWinThread派生的RUNTIME CLASS类 nPriority指定线程优先级 如果为0 则与创建该线程的线程相同 nStackSize指定线程的堆栈大小 如果为0 则与创建该线程的线程相同 dwCreateFlags是一个创建标识 如果是CREATE SUSPENDED 则在悬挂状态创建线程 在线程创建后线程挂起 否则线程在创建后开始线程的执行 lpSecurityAttrs表示线程的安全属性 NT下有用 五 线程的管理和操作 2 UI线程 启动UI线程方法一 1 利用类向导创建一个CWinThread的子类CMyUIThread 2 CMyUIThread pThread pThread CMyUIThread AfxBeginThread RUNTIME CLASS CMyUIThread 五 线程的管理和操作 2 UI线程 启动UI线程方法二 1 调用线程类的构造函数创建一个线程对象 2 调用CWinThread CreateThread函数来启动该线程 五 线程的管理和操作 2线程的悬挂 恢复 CWinThread类中包含了应用程序悬挂和恢复它所创建的线程的函数 其中SuspendThread 用来悬挂线程 暂停线程的执行 ResumeThread 用来恢复线程的执行 如果你对一个线程连续若干次执行SuspendThread 则需要连续执行相应次的ResumeThread 来恢复线程的运行 五 线程的管理和操作 3结束线程 终止线程有三种途径 线程可以在自身内部调用AfxEndThread 来终止自身的运行 可以在线程的外部调用BOOLTerminateThread HANDLEhThread DWORDdwExitCode 来强行终止一个线程的运行 然后调用CloseHandle 函数释放线程所占用的堆栈 第三种方法是改变全局变量 使线程的执行函数返回 则该线程终止 五 线程的管理和操作 4 线程间的通信 通常情况下 一个次级线程要为主线程完成某种特定类型的任务 这就隐含着表示在主线程和次级线程之间需要建立一个通信的通道 一般情况下 有下面的几种方法实现这种通信任务 使用全局变量 使用事件对象 使用消息 五 线程的管理和操作 4 线程间的通信 1 利用用户定义的消息通信在Windows程序设计中 应用程序的每一个线程都拥有自己的消息队列 甚至工作线程也不例外 这样一来 就使得线程之间利用消息来传递信息就变的非常简单 首先用户要定义一个用户消息 如下所示 defineWM USERMSGWMUSER 100 在需要的时候 在一个线程中调用 PostMessage HWND param WM USERMSG 0 0 或CwinThread PostThreadMessage 五 线程的管理和操作 4 线程间的通信 UINTThreadFunction LPVOIDpParam while bend Beep 100 100 Sleep 1000 PostMessage hWnd WM USERMSG 0 0 return0 五 线程的管理和操作 4 线程间的通信 WM USERMSG消息的响应函数为OnThreadended WPARAMwParam LPARAMlParam LONGCMyDlg OnThreadended WPARAMwParam LPARAMlParam AfxMessageBox Threadended Retrun0 五 线程的管理和操作 4 线程间的通信 上面的例子是工作者线程向用户界面线程发送消息 对于工作者线程 如果它的设计模式也是消息驱动的 那么调用者可以向它发送初始化 退出 执行某种特定的处理等消息 让它在后台完成 在控制函数中可以直接使用 GetMessage 这个SDK函数进行消息分检和处理 自己实现一个消息循环 GetMessage 函数在判断该线程的消息队列为空时 线程将系统分配给它的时间片让给其它线程 不无效的占用CPU的时间 如果消息队列不为空 就获取这个消息 判断这个消息的内容并进行相应的处理 五 线程的管理和操作 4 线程间的通信 2 用事件对象实现通信在线程之间传递信号进行通信比较复杂的方法是使用事件对象 用MFC的CEvent类的对象来表示 事件对象有两种状态 有信号和无信号 线程可以监视处于有信号状态的事件 以便在适当的时候执行对事件的操作 五 线程的管理和操作 4 线程间的通信 UINTThreadFunction LPVOIDpParam WaitForSingleObject threadStart m hObject INFINITE intresult WaitForSingleObject threadEnd m hObject 0 等待threadEnd事件有信号 无信号时线程在这里悬停If result WAIT OBJECT 0 bend TRUE 五 线程的管理和操作 4 线程间的通信 VoidCtestView OninitialUpdate hWnd GetSafeHwnd threadStart SetEvent threadStart事件有信号pThread AfxBeginThread ThreadFunction hWnd 启动线程pThread m bAutoDelete FALSE Cview OnInitialUpdate 五 线程的管理和操作 4 线程间的通信 VoidCtestView OnDestroy threadEnd SetEvent WaitForSingleObject pThread m hThread INFINITE deletepThread Cview OnDestroy 五 线程的管理和操作 5 线程之间的同步 由于各个线程可以访问进程中的公共变量 所以使用多线程的过程中需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据 以免破坏数据的完整性 保证各个线程可以在一起适当的协调工作称为线程之间的同步 前面介绍的事件对象实际上就是一种同步形式 五 线程的管理和操作 5 线程之间的同步 VisualC 中使用同步类来解决操作系统的并行性而引起的数据不安全的问题 MFC支持的七个多线程的同步类可以分成两大类 同步对象 CSyncObject CSemaphore CMutex CCriticalSection和CEvent 和同步访问对象 CMultiLock和CSingleLock 这些同步对象使各个线程协调工作 程序运行起来更安全 五 线程的管理和操作 5 线程之间的同步 1 临界区临界区是保证在某一个时间只有一个线程可以访问数据的方法 使用它的过程中 需要给各个线程提供一个共享的临界区对象 无论哪个线程占有临界区对象 都可以访问受到保护的数据 这时候其它的线程需要等待 直到该线程释放临界区对象为止 临界区被释放后 另外的线程可以强占这个临界区 以便访问共享的数据 五 线程的管理和操作 5 线程之间的同步 1 临界区临界区对应着一个CcriticalSection对象 当线程需要访问保护数据时 调用临界区对象的Lock 成员函数 当对保护数据的操作完成之后 调用临界区对象的Unlock 成员函数释放对临界区对象的拥有权 以使另一个线程可以夺取临界区对象并访问受保护的数据 同时启动两个线程 它们对应的函数分别为WriteThread 和ReadThread 用以对公共数组array 操作 五 线程的管理和操作 5 线程之间的同步 1 临界区 include afxmt h intarray 10 destarray 10 CCriticalSectionSection UINTWriteThread LPVOIDparam Section Lock for intx 0 x 10 x array x x 1 Sleep 10 Section Unlock return1 五 线程的管理和操作 5 线程之间的同步 1 临界区UINTReadThread LPVOIDparam Section Lock for intx 0 x 10 x destarray x array x Section Unlock return1 五 线程的管理和操作 5 线程之间的同步 2 互斥互斥与临界区很相似 但是使用时相对复杂一些 它不仅可以在同一应用程序的线程间实现同步 还可以在不同的进程间实现同步 从而实现资源的安全共享 互斥与CMutex类的对象相对应 使用互斥对象时 必须创建一个CSingleLock或CMultiLock对象 用于实际的访问控制 因为这里的例子只处理单个互斥 所以我们可以使用CSingleLock对象 该对象的Lock 函数用于占有互斥 Unlock 用于释放互斥 五 线程的管理和操作 5 线程之间的同步 2 互斥 include afxmt h intarray 10 destarray 10 CMutexSection UINTWriteThread LPVOIDparam CSingleLocksinglelock 五 线程的管理和操作 5 线程之间的同步 2 互斥UINTReadThread LPVOIDparam CSingleLocksinglelock 五 线程的管理和操作 5 线程之间的同步 3 信号量信号量的用法和互斥的用法很相似 不同的是它可以同一时刻允许多个线程访问同一个资源 创建一个信号量需要用CSemaphore类声明一个对象 一旦创建了一个信号量对象 就可以用它来对资源的访问技术 要实现计数处理 先创建一个CSingl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 十五五规划纲要:应急物资保障技术的创新与快速调配
- 十五五规划纲要:石墨烯技术的规模化应用与产业赋能
- 2026年蔬菜种植公司安全生产事故报告与调查管理制度
- 2026年能源加工公司会计档案管理规范管理制度
- 数据要素流通:“十五五”数字化区域协同
- 十五五医院规划纲要
- 2025浙江杭州建德市国企业招引高级工程职业经理人1人易考易错模拟试题(共500题)试卷后附参考答案
- 2025江苏省南通市海安市融媒体中心公开招聘工作人员笔试易考易错模拟试题(共500题)试卷后附参考答案
- 2025江苏无锡市锡山文商旅发展限公司招聘14人易考易错模拟试题(共500题)试卷后附参考答案
- 航空经济知识题库及答案
- JJG 1189.3-2022测量用互感器第3部分:电力电流互感器
- GB/T 22415-2008起重机对试验载荷的要求
- 中国地质大学武汉软件工程专业学位研究生实践手册
- 第六章-复合材料课件
- 无水三甲胺MSDS危险化学品安全技术说明书
- 企业标准编写模板
- 医学心理学(全套)课件
- DBJ50T-163-2021 既有公共建筑绿色改造技术标准 清晰正式版
- 低阶煤、褐煤干法制备气化用高浓度水煤浆技术
- 沟通技巧与人文关怀课件
- 食物不耐受权威量表
评论
0/150
提交评论