第9章 多 线 程.

Slides:



Advertisements
Similar presentations
作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2016/7/21 行程的同步 註:本章學術性較重,但考試常考。
Advertisements

定 格 入 格 破 格 —— 新诗仿写复习训练 仿照下列句子,再把 “ 人生 ” 比喻成 “ 大海 ”“ 天空 ” , 造两个句子。 如果说人生是一首优美的乐曲,那么痛苦则 是其中一个不可或缺的音符。 参考答案: 1 、如果说人生是一望无际的大海,那么挫折则 是其中一个骤然翻起的浪花。 2 、如果说人生是一片湛蓝的天空,那么失意则.
专业介绍 计算机网络技术专业(智能建筑及数字社区技术方向) 广州市广播电视大学 信息与工程学院
Windows Company Logo 你要知道的 告诉你的客户 windows7 好在哪 1 向客户推荐 windows 7 2 向客户演示 windows7 3 如何识别正版 windows7 4.
学年度工作总结 —— 上海建桥学院 —— 上海建桥学院 实验室与资产管理处 实验室与资产管理处.
© 2012 IBM Corporation IBM 中国系统与科技研发中心 --- IBM i 实验室之旅 利用工具分析 IBM i 程序性能 应锦鑫, IBM i 性能工具高级软件工程师 IBM 中国系统与科技研发中心.
软件开发技术基础 第 3 章 操作系统及程序设计 讲授教师:卫颜俊. 主 要 内 容 主 要 内 容 操作系统及其功能 进程管理应用程序设计 内存管理应用程序设计 设备与文件管理应用程序设计 人机接口管理应用程序设计.
职业指导服务系统 欢迎了解职业指导服务系统!
学前教育信息化发展及应用 华中师范大学儿童数字化学习研究中心 武汉华大天童教育科技有限公司.
醫療不良事件通報 萬芳醫院護理部 吳麗彬.
讓你的程式具有多工(Multitasking) 及多重處理(Multiprocessing)的能力
104年度北區聯防組織分支組織組長會議暨說明會
订单合并拆分功能详解 荷叶.
讓人看了難忘的故事 中藥房轉載 分享人生積極正面訊息 創造宇宙合諧快樂能量.
校园信息管理系统 河北科技大学网络中心 2000/4/10.
第九讲 医院信息系统应用——住院子系统一.
普通话与说话训练 第六章 会话的艺术.
保典配精英 宝剑配英雄 对职业代理人而言,保费固然重要,但更重要的是通过专业金融服务获得源源不断的客户,轻松愉快的长期签单。
传统采购与现代采购的区别.
颈椎移位.
提高自身素质做好 新时期班主任工作 北京市广渠门中学 高金英.
作業系統 第六章 同步與死結.
普通话模拟测试 与学习平台 使用指南.
徵收苗栗市福全段147、1588及文心段10、11地號等4筆土地之
第 八 章 交互结构(2).
日新月异的信息技术.
網路小說劇情建構與伏線營造 Windows98.
讲 义 大家好!根据局领导的指示,在局会计科和各业务科室的安排下,我给各位简要介绍支付中心的工作职能和集中支付的业务流程。这样使我们之间沟通更融洽,便于我们为预算单位提供更优质的服务。 下面我主要从三方面介绍集中支付业务,一是网上支付系统,二是集中支付业务流程及规定等,
第五章 处理机管理 5.1 引言 5.2 调度算法 5.3 调度算法性能分析 5.4 实时调度 5.5 多处理机调度 5.6 调度算法举例
第二章 进程管理.
中国人民公安大学经费管理办法(试行) 第一章总则 第四条:“一支笔” “一支笔”--仅指单位主要负责人。负责对本 单位的经费进行审核审批。
教育测验的编制.
关于整合检验检测认证机构实施意见的通知(国办发〔2014〕8号)
飞行射击游戏 ——结题报告 By 罗一轲、陈夏琨.
推进德育创新 做好新时期班主任工作 北京市广渠门中学 高金英.
基于VC++的数字图像特效处理系统的设计与实现
科學科 污染 空氣 成因 的 : 題目 及 減少空氣污染的方法 陳玉玲 (4) 姓名 : 去到目錄.
Chapter 6 同步 (Synchronization)
中央广播电视大学计算机课程 操 作 系 统.
项目一 认识计算机.
小学信息技术第一册 教材内容介绍.
多线程编程基本概念 2008.
Visual C++ Windows Programming
多核结构与程序设计 杨全胜 东南大学成贤学院计算机系.
中视前卫OA项目培训 准备人: 李鹏 / 公司: 泛微公司 / 日期: 2017/11/20 中视前卫信息化项目组.
【VA虚拟应用管理平台】专题培训 资源管理及个性化 陕西益和信息技术开发有限责任公司 2011年2月.
关检合作“一单两报” 项目介绍 数据中心 2014年 11月.
第1章 Windows应用程序框架的 创建与消息处理
第三章 进程互斥与同步 进程通信 Communication.
2018/12/6 中文Word2000的使用方法.
多核结构与程序设计 杨全胜 东南大学成贤学院计算机系.
昭阳系列 数据交换安全锁软件功能介绍 DEL (Data Exchange Lock)
第2章 进程和线程 内容提要: 2.1 进 程 概 念 2.2 进程的状态和组成 2.3 进 程 管 理 2.4 线 程.
计算机组装、维修及 实训教程 第17章 微机软件的安装与设置 2019年4月11日星期四.
【VA虚拟应用管理平台】专题培训 资源管理及个性化 陕西益和信息技术开发有限责任公司 2011年2月.
2008学年上学期教材分析 四年级上 范谊 2008年9月1日.
南宁翰林华府 ——地中海风格与现代住宅的融合.
微信商城系统操作说明 色卡会智能门店.
动态链接库 主讲人:孙鑫
WINDOWS 7 磁盘管理.
教育部特殊教育通報網 學生異動、接收操作說明.
第三章 軟體資源管理 授課老師:褚麗絹.
MultiThread Introduction
售后培训系列之V9系统中心安装 SecManage 网安事业部 广州售后-王长绪.
大綱 一.受試者之禮券/禮品所得稅規範 二.範例介紹 三.自主管理 四.財務室提醒.
亞洲大學 資訊工程學系 多重來源影像監控系統
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
Section 2-2: 4 (6), 7, 12 (14), 13, 18 (16), 21, 25, 28, 30, 36, 46, 48, 50, 54a Section 3-1: 4 (2), 5, 10, 15, 20, 29, 32 Section 4-1: 3, 7, 8,
手工编写第一个 MFC程序 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
Presentation transcript:

第9章 多 线 程

本章主要介绍Windows操作系统下多线程的基本概念、创建管理线程的方法,以及线程的同步问题。

同时,MFC对线程操作进行了封装,提供了支持线程操作的类库。 本章主要讨论这些技术,并且给出相应的实例。

本章主要内容如下: ● Windows下多线程的基本概念; ● 用户界面线程和工作者线程; ● 线程的管理操作; ● 线程的同步; ● 多线程编程实例。

多线程的基本概念 两种重要的线程 线程的操作 9.1 两种重要的线程 9.2 线程的操作 9.3 小 结 9.4

9.1 多线程的基本概念 在Win32下,一个应用程序由一个或多个进程组成。 9.1 多线程的基本概念 在Win32下,一个应用程序由一个或多个进程组成。 一个进程由一个或多个线程以及代码、数据和其他内存中的程序资源组成。 典型的程序资源包括打开的文件、信号量、动态分配的内存等。 线程在进程空间中执行。

线程是操作系统分配处理器时间的最小单位。 每个线程有自己的堆栈、CPU寄存器、以及程序入口。 每个线程共享所有处理器的资源。

进程中的每个线程都独立执行,不会影响该进程中的其他线程。 所有线程共享公共的资源。 因此必须采用信号量或者其他进程间通信方法来调整线程的工作。

9.2 两种重要的线程 Windows提供了两种线程,即用户界面线程和工作者线程。 9.2 两种重要的线程 Windows提供了两种线程,即用户界面线程和工作者线程。 用户界面线程通常用来处理消息循环、与用户交互,工作者线程用来处理后台的计算。 下面分别介绍这两种线程。

9.2.1 用户界面线程 每一个Windows应用程序都有一个主线程。 这里的用户界面线程是指用来和用户进行交互的线程。

接收用户传送的数据,并且做出响应。 用户界面线程通常包含自己的窗口,有自己的消息循环,独立于应用程序的其他部分。

创建一个用户界面线程需要首先继承线程类CWinThread,重载它的成员函数,如表9-1所示。 最后调用AfxBeginThread创建线程对象。

表9-1 需要重载的CWinThread的成员函数 函 数 名 称 作 用 InitInstance 线程的初始化,通常需要重载 ExitInstance 释放线程占用的资源,通常需要重载 OnIdle 空闲时间的处理,不一定重载 PreTranslateMessage 过滤消息,不一定重载 ProcessWndProcException 处理线程抛出的意外 Run 线程控制函数,通常不重载

9.2.2 工作者线程 工作者线程通常用来处理后台运行的任务。 在后台任务运行的同时,用户可进行其他操作,不必等待后台任务的结束。

例如,一个三维模型编辑软件,用户要对两个模型做布尔运算。 在进行计算的同时,用户希望可以观察两个模型,对模型进行旋转,缩放的操作。

再如文本浏览软件的打印功能,在打印文本的工程中,用户仍然会继续浏览文本内容。 这些都属于工作者线程。

创建一个工作者线程只需要两个步骤。 首先实现工作者线程的功能函数,然后启动线程即可。

可以调用Win32提供的API函数CreateThread创建一个线程,MFC对Win32的线程操作做了封装,也可以通过调用AfxBeginThread创建一个线程对象。 这些函数及其调用方法将在下一节详细介绍。

9.3 线程的操作 本节介绍Windows线程的操作方法,包括线程的创建、线程的管理、线程的同步、线程的终止等。

9.3.1 线程的创建 线程的创建方法有3种,分别介绍如下。 9.3.1 线程的创建 线程的创建方法有3种,分别介绍如下。 1.调用Win32API函数CreateThread和CreateRemoteThread (1)CreateThread (2)CreateRemoteThread

2.C运行库函数_beginthreadex 3.调用函数AfxBeginThread

2.Win32API函数TerminateThread 3.C运行库函数 4.函数AfxEndThread 9.3.2 线程的终止 1.调用Win32API函数ExitThread 2.Win32API函数TerminateThread 3.C运行库函数 4.函数AfxEndThread

9.3.3 线程的管理和操作 1.线程的挂起、继续和休眠 (1) 挂起。 (2)继续。 (3)休眠。

2.线程的优先级 (1)级别。

表9-2 进程优先级列表 优 先 级 优 先 级 值 ABOVE_NORMAL_PRIORITY_CLASS 表9-2 进程优先级列表 优 先 级 优 先 级 值 ABOVE_NORMAL_PRIORITY_CLASS 大于NORMAL_PRIORITY_CLASS, 小于HIGH_PRIORITY_CLASS BELOW_NORMAL_PRIORITY_CLASS 大于IDLE_PRIORITY_CLASS, 小于NORMAL_PRIORITY_CLASS

续表 优 先 级 优 先 级 值 HIGH_PRIORITY_CLASS 13 IDLE_PRIORITY_CLASS 4 优 先 级 优 先 级 值 HIGH_PRIORITY_CLASS 13 IDLE_PRIORITY_CLASS 4 NORMAL_PRIORITY_CLASS 9(前台)或7(后台) REALTIME_PRIORITY_CLASS 24

表9-3 线程优先级列表 优 先 级 级 别 THREAD_PRIORITY_ABOVE_NORMAL 比进程优先级高一级 THREAD_PRIORITY_BELOW_NORMAL 比进程优先级低一级 THREAD_PRIORITY_HIGHEST 比进程优先级高两级 THREAD_PRIORITY_LOWEST 比进程优先级低两级 THREAD_PRIORITY_NORMAL 与进程优先级相同 THREAD_PRIORITY_TIME_CRITICAL 把线程优先级设为15 THREAD_PRIORITY_IDLE 把线程优先级设为1

(2)优先级的设置和获取。

3.线程ID的判断 4.线程的切换 5.打开线程 6.线程函数ThreadProc 7.获得线程的时间信息

8.处理器相关操作 (1)SetThreadAffinityMask函数 (2)SetThreadIdealProcessor函数

9.3.4 线程间的通信 线程间的通信通常采用共享全局变量,共享存储区来实现。 因为所有的线程都可以访问这些资源。 主线程不能通过发送消息给辅助线程实现通信,但辅助线程可以通过发送自定义消息达到和主线程通信的目的。

本节将通过一个简单的实例,介绍使用共享存储区和自定义消息实现线程间通信的功能。 【例9-1】 线程之间通信实例。

(a) (b) 图9-1 程序运行界面

9.3.5 线程的同步 在多线程程序设计中,经常会出现两个或多个线程使用一个公共变量,或者多个线程共享一些公共存储区的情况。

凡是涉及共享资源的情况都有可能会引起程序的错误。 为了解决这些问题,Windows提供了大量线程的同步方法,例如,变量锁、临界区、信号量、事件对象、互斥对象等。

一个或两个变量的互锁操作是最简单的同步原语。 Win32提供了7个具有线程安全性的原子操作,具体介绍如下。 1.互锁操作 一个或两个变量的互锁操作是最简单的同步原语。 Win32提供了7个具有线程安全性的原子操作,具体介绍如下。 (1)InterlockedIncrement (2)InterlockedDecrement

(3)InterlockedExchange (4)InterlockedExchangeAdd (5)InterlockedExchangePointer (6)InterlockedCompareExchange (7)InterlockedCompareExchange Pointer

临界区(Critical Section)是一段程序代码,在任何时候都只能被一个线程使用。 2.临界区 临界区(Critical Section)是一段程序代码,在任何时候都只能被一个线程使用。 如果有多个线程同时访问临界区,这时只能有一个线程进入,其他线程则等待,直到临界区被释放。

与其他同步方法不同的是,临界区只能在单个进程内使用。 使用临界区的时候要避免长时间锁住一份资源。

进入临界区后必须尽快地离开,释放资源。 如果是主线程(GUI线程)要进入一个没有被释放的临界区,将会出现错误。

(1)InitializeCriticalSection (2)DeleteCriticalSection (3)EnterCriticalSection (4)LeaveCriticalSection (5)CcriticalSection

表9-4 CEvent类的成员函数 函 数 名 称 作 用 CCriticalSection 作 用 CCriticalSection 构造函数,构造CCriticalSection对象 Lock 进入临界区 UnLock 离开临界区

事件(Event)是由Windows操作系统管理的同步对象,可以用于进程或线程的同步。 3.事件 事件(Event)是由Windows操作系统管理的同步对象,可以用于进程或线程的同步。 一个事件被创建后,只有激发状态和未激发状态两种状态,也称为发信号状态和未发信号状态。

事件包括手动重置事件和自动重置事件两种类型。 手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持激发状态,直到程序重新把它设置为未激发状态。

自动重置事件被设置为激发状态后,会唤醒一个等待中的线程,然后自动恢复为未激发状态。 所以用自动重置事件来同步两个线程比较理想。

(1)CreateEvent (2)OpenEvent (3)SetEvent、ResetEvent和PulseEvent函数 (4)Cevent

表9-5 CEvent类的成员函数 函 数 名 称 作 用 CEvent 构造函数,构造CEvent对象 SetEvent 作 用 CEvent 构造函数,构造CEvent对象 SetEvent 启动事件对象,释放等待线程 PulseEvent 启动事件对象,释放等待线程,或者重置事件对象 为未激活状态 ResetEvent 设置事件对象为未激活状态 Unlock 释放事件对象

4.互斥器 互斥器(Mutex)的功能与临界区相似。区别在于互斥器所花费的时间比临界区多很多,但是互斥器是核心对象(后面介绍的Event和Semaphore也是核心对象),可以跨进程使用,而且等待一个被锁住的互斥器可以设定TIMEOUT,不会像临界区那样无法得知临界区的情况,一直等待。

Win32提供了创建互斥器CreateMutex(),打开互斥器OpenMutex(),释放互斥器ReleaseMutex()等操作。

Mutex的拥有权并非属于产生它的那个线程,而是属于最后对此Mutex进行等待操作(Wait ForSingleObject)并且尚未进行ReleaseMutex()操作的线程。

线程拥有Mutex就好像进入临界区一样,一次只能有一个线程拥有该Mutex。 如果一个拥有Mutex的线程在返回之前没有调用ReleaseMutex(),那么这个Mutex就被舍弃了。

当其他线程等待这个Mutex时,仍能返回,并得到一个WAIT_ABANDONED_0返回值,一个Mutex被舍弃是Mutex特有的功能。

(1)CreateMutex (2)OpenMutex (3)ReleaseMutex (4)CMutex

信号量(Semaphore)是最具历史的同步机制。 信号量是解决producer/consumer问题的关键要素。 5.信号量 信号量(Semaphore)是最具历史的同步机制。 信号量是解决producer/consumer问题的关键要素。 对应的MFC类是CSemaphore。 Win32函数CreateSemaphore()用来产生信号量。

Release Semaphore()用来解除锁定。 Semaphore的现值代表的意义是目前可用的资源数,如果Semaphore的现值为1,表示还有一个锁定动作可以成功。

如果现值为5,就表示还有5个锁定动作可以成功。 当调用Wait等函数要求锁定,如果Semaphore现值不为0,Wait马上返回,资源数减1。

当调用ReleaseSemaphore()资源数加1,当时不会超过初始设定的资源总数。

(1)CreateSemaphore (2)OpenSemaphore (3)ReleaseSemaphore (4)Csemaphore

小 结 本章主要介绍Windows操作系统下多线程的基本概念,如何创建和管理线程,以及线程的同步问题。

通过本章的介绍,读者可以看出,多线程程序设计通常比一般的单线程程序复杂,在程序设计过程中,一定要考虑清楚各线程的关系,避免出现死锁或不同步的现象。

另外需要注意现在大多数用户使用单CPU计算机,在这种机器上运行多线程程序,有时反而会降低系统的性能。 因此,在设计多线程应用程序时,应慎重选择,视具体情况加以处理,使应用程序获得最佳的性能。