![《C__Win实践开发教程》chp5[1]多线程编程技术.ppt_第1页](http://file.renrendoc.com/FileRoot1/2020-1/20/6760b1f1-92bb-4973-96d3-5f393619f56e/6760b1f1-92bb-4973-96d3-5f393619f56e1.gif)
![《C__Win实践开发教程》chp5[1]多线程编程技术.ppt_第2页](http://file.renrendoc.com/FileRoot1/2020-1/20/6760b1f1-92bb-4973-96d3-5f393619f56e/6760b1f1-92bb-4973-96d3-5f393619f56e2.gif)
![《C__Win实践开发教程》chp5[1]多线程编程技术.ppt_第3页](http://file.renrendoc.com/FileRoot1/2020-1/20/6760b1f1-92bb-4973-96d3-5f393619f56e/6760b1f1-92bb-4973-96d3-5f393619f56e3.gif)
![《C__Win实践开发教程》chp5[1]多线程编程技术.ppt_第4页](http://file.renrendoc.com/FileRoot1/2020-1/20/6760b1f1-92bb-4973-96d3-5f393619f56e/6760b1f1-92bb-4973-96d3-5f393619f56e4.gif)
![《C__Win实践开发教程》chp5[1]多线程编程技术.ppt_第5页](http://file.renrendoc.com/FileRoot1/2020-1/20/6760b1f1-92bb-4973-96d3-5f393619f56e/6760b1f1-92bb-4973-96d3-5f393619f56e5.gif)
已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于C 语言 主讲教师 钱哨本课学时 72课时联系方式 qianshao Windows程序设计 第五章 多线程编程技术 本章主要内容介绍5 1计算机线程介绍5 2System Threading简介5 3线程的优先级与锁技术 CONTENT 本章学习目标 理解线程的概念理解 NET中线程的属性和方法创建和使用线程理解线程的特点 优点及使用场合 同时执行所有任务 时间更少 效率更高 5 1线程简介 读 写 一览无遗 血液循环 在同一时间点执行各项进程 编译程序发送 接收邮件打印文件其他 操作系统允许计算机同时执行多项操作 程序 进程 5 1线程简介 程序1 程序2 线程1 线程2 线程3 线程1 线程2 线程3 单独的执行路径 多线程 5 1线程简介 进程 是应用程序的一个运行例程 是应用程序的一次动态执行过程 线程 是进程中的一个执行单元 是操作系统分配CPU时间的基本单元 Windows是一个支持多线程的系统 一个进程可以包含若干个线程 5 1线程简介 在以下情况中可能要使用到多线程 程序需要同时执行两个或多个任务 程序要等待某事件的发生 例如用户输入 文件操作 网络操作 搜索等 后台程序 5 1线程简介 多线程 在同一时间执行多个任务的功能 称为多线程或自由线程 多线程的优点 可以同时完成多个任务 可以使程序的响应速度更快 可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务 可以随时停止任务 可以设置每个任务的优先级以优化程序性能 多线程的缺点 对资源的共享访问可能造成冲突 对共享资源的访问进行同步或控制 程序的整体运行速度减慢等等 在C 应用程序中 第一个线程总是Main 方法 因为第一个线程是由 NET运行库开始执行的 Main 方法是 NET运行库选择的第一个方法 后续的线程由应用程序在内部启动 即应用程序可以创建和启动新的线程 5 2System Threading命名空间 5 2System Threading命名空间 在 NET程序设计中 线程是使用Thread类 或Timer类 线程计数器 ThreadPool类 线程池 来处理的 这些类在System Threading命名空间中 usingSystem Threading Thread类 实现线程的主要方法 一个Thread实例管理一个线程 即执行序列 通过简单实例化一个Thread对象 就可以创建一个线程 然后通过Thread对象提供的方法对线程进行管理 Timer类 适用于间隔性的完成任务 ThreadPool类 适用于多个小的线程 1 Thread类的属性和方法 引用System Threading命名空间 Thread线程实例名 newThread newThreadStart 方法名 运行在线程上的方法 只创建但不启动线程 线程实例名 Start 1 Thread类的属性和方法 2 线程的生命周期 在I O操作期间线程被阻止 线程已创建但并未启动 线程已启动 I O操作完成后运行 线程被阻止 另一个操作正在进行 提前中断或特地停止线程 暂时中断的线程 线程已恢复 等待 休眠 加入 已暂停 正在运行 已停止 未开始 已开始 已阻止 暂停 发送 I O 请求 等待 休眠 加入 开始 I O 完成 完成 恢复 5 3线程的建立与启动 新建一个线程的过程 只需将其声明并为其提供线程起始点处的方法委托 再用Thread Start 方法启动该线程 1 声明 Threada 2 实例化a newThread newThreadStart b 其中 b为新建过程中执行的过程名 3 调用Thread Start 方法启动该线程a Start 5 3线程的建立与启动 usingSystem usingSystem Threading publicclassA publicvoidff 线程启动时调用此方法 Console WriteLine A ff 方法在另一个线程上运行 Thread Sleep 3000 将线程阻塞一定时间Console WriteLine 终止工作线程调用此实例方法 publicstaticvoidgg Console WriteLine A gg 方法在另一个线程上运行 Thread Sleep 5000 将线程阻塞一定时间Console WriteLine 终止工作线程调用此静态方法 例题1 线程的建立和启动 5 3线程的建立与启动 publicclassB publicstaticvoidMain Console WriteLine 线程简单示例 Aa newA Threads1 newThread newThreadStart a ff s1 Start Console WriteLine 启动新线程ff 方法后 被Main 线程调用 Threads2 newThread newThreadStart A gg s2 Start Console WriteLine 启动新线程gg 方法后 被Main 线程调用 Console ReadLine 例题1 线程的建立和启动 5 3线程的建立与启动 线程的挂起 或暂停 1 调用Thread Sleep 方法将线程挂起 注 Sleep 方法指定的时间以毫秒为单位 2 调用s1 Suspend 方法将线程挂起区别 前者为静态方法 并且使线程立即暂停一定时间 后者为实例方法 不会使线程立即停止执行 直到线程到达安全点之后 它才将该线程暂停 线程的恢复与终止调用Resume 方法将线程恢复 调用Abort 方法将线程终止 线程的挂起 恢复与终止 其他与操作线程相关的方法 Join 使一个线程等待另一个线程停止Interrupt 中断处于JoinWaitSleep线程状态的线程 5 4线程的优先级 classSimpleThreadDemo staticvoidMain string args Thread CurrentThread Name 主线程 ThreadobjThread newThread newThreadStart ActionMethod objThread Name 子线程 启动子线程 并为该线程执行ActionMethodobjThread Start 这将为主线程执行ActionMethodActionMethod staticvoidActionMethod for intcount 1 count 10 count Console WriteLine 线程名 Thread CurrentThread Name 实例化objThread线程并开始执行ActionMethod 将由应用程序线程执行 输出结果混乱 5 4线程的优先级 线程是根据其优先级来调度的 每个线程都有特定的优先级 每个线程在创建时其优先级为 ThreadPriority Normal线程的优先级定义为ThreadPriority枚举类型 如下表 5 4线程的优先级 例题1 staticvoidTaskTwo for intindex 5000 index 4990 index Console WriteLine index staticvoidMain string args ThreadobjThreadOne newThread newThreadStart TaskOne ThreadobjThreadTwo newThread newThreadStart TaskTwo objThreadOne Start objThreadTwo Start staticvoidTaskOne for intcount 1 count 5 count Console WriteLine count 2 无优先级线程 同时执行 输出无序 例题1 staticvoidMain string args Thread CurrentThread Name 主线程 ThreadobjThreadOne newThread newThreadStart TaskOne objThreadOne Name 子线程1 ThreadobjThreadTwo newThread newThreadStart TaskTwo objThreadTwo Name 子线程2 这将启动子线程objThreadOne Start objThreadTwo Start objThreadTwo Priority ThreadPriority Highest 将在执行第一个线程前执行objThreadTwo 5 4线程的优先级 5 4线程的优先级 代码见下 问题 请将代码执行多次 观察每次执行顺序的不同之处 为什么代码执行是完全不同呢 结论 如果不将线程按照一定的顺序运行 则线程代码在处理上将会混乱不堪 例题2 使用三个线程显示计数 5 4线程的优先级 线程优先级小结 如果自行提高一个线程的优先级 那么该线程就会相应的获得更多的CPU时间 通过降低了线程的优先级 该线程就会被分配到比原来少的CPU时间了 你可以在一个线程开始运行前或是在它的运行过程中的任何时候改变它的优先级 理论上你还可以任意的设置每个线程的优先级 不过一个优先级过高的线程往往会影响到其他线程的运行 甚至影响到其他程序的运行 所以最好不要随意的设置线程的优先级 例题1 使用三个线程显示计数 代码更改 5 5线程的同步 使用线程的一个重要方面是同步访问多个线程访问的任何变量 背景 当多个线程共享数据 其中一个或多个线程要修改数据时 有可能引起数据不统一等问题 同步 是指在某一时刻只有一个线程可以访问某共享数据 1 同步的含义同步问题的产生 主要是由于在高级语言的源代码中 大多数情况下看起来是一条语句 但在最后编译好的汇编语言机器码中则会被翻译为许多条语句 从而在操作系统调度时被划分到不同的时间片中 例如 5 5线程的同步 例如 message Helloworld 这条语句在C 语法上是一条语句 但在执行代码时 实际上它涉及到许多操作 需要重新分配内存以存储更长的新字符串 需要设置变量message使之指向新的内存 需要复制实际文本等 5 5线程的同步 通过对指定对象的加锁和解锁可以实现同步代码段的访问 在 NET的System Threading命名空间中提供了Monitor类来实现加锁与解锁 该类中的方法都是静态的 如下表 1 在C 中处理同步 锁定机制 程序 线程1 线程2 共享资源 锁定机制保证每次只有一个线程可以访问共享资源 缓冲和隔离 示例 classThreadLockDemo staticvoidMain Thread CurrentThread Name 主线程 ThreadLockDemoobjDemo newThreadLockDemo ThreadnewThread newThread newThreadStart objDemo DoTask newThread Name 子线程 newThread Start objDemo DoTask voidDoTask lock this for intcount 1 count 10 count Console WriteLine 线程名 Thread CurrentThread Name 实例化newThread线程并开始执行DoTask 锁定当前实例objDemo 在块中完成执行 然后释放对象 5 5线程的同步 C 中lock关键字提供了与Monitoy Enter和Monitoy Exit同样的功能 这种方法用在你的代码段不能被其他独立的线程中断的情况 通过对Monitor类的简易封装 lock为同步访问变量提供了一个非常简单的方式 其用法如下 lock x 使用x的语句 1 在C 中处理同步 lock语句把变量放在圆括号中 以包装对象 称为独占锁或排它锁 当执行带有lock关键字的复合语句时 独占锁会保留下来 当变量被包装在独占锁中时 其他线程就不能访问该变量 如果在上面的代码中使用独占锁 在执行复合语句时 这个线程就会失去其时间片 如果下一个获得时间片的线程试图访问变量 就会被拒绝 Windows会让其他线程处于睡眠状态 直到解除了独占锁为止 5 5线程的同步 代码见下 例题1 使用lock同步线程 完成10个线程的取钱工作 代码见下 例题2 两个线程的互相执行过程演示 5 5线程的同步 2 同步时要注意的问题 线程同步非常重要 但只在需要时使用也是非常重要的 因为这会降低性能 原因有两个 首先 在对象上放置和解开锁会带来某些系统开销 但这些系统开销都非常小 第二个原因更为重要 线程同步使用得越多 等待释放对象的线程就越多 如果一个线程在对象上放置了一个锁 需要访问该对象的其他线程就只能暂停执行 直到该锁被解开 才能继续执行 结论 在lock块内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 账户知识培训简报课件
- 象棋的课件教学课件
- 2025版天花吊顶工程智能化设计与施工合同
- 2025年度水电工程绿色施工与节能减排承包合同样本
- 2025版啤酒行业风险管理与保险合同
- 2025版全新智能电网建设项目施工合同编号下载
- 2025版石材长途运输合同及风险防控协议
- 2025版汽车用品试用销售与售后服务合同
- 2025年度东昌府区交通运输局交通设施租赁合同
- 2025版洗煤厂租赁合同及设备更新改造责任书
- 2025四川省公安厅警务辅助人员招聘(448人)笔试备考试题及答案解析
- 基础护理学题库及答案
- 《遵守校纪班规》课件
- 走进焊接 课件 2.1百花齐放推陈出新-焊接方法
- 北京市律师协会律师办理法律尽职调查业务操作指引
- (2025年标准)会员销售协议书
- 2025至2030中国专业图片存档和通信系统(PACS)行业项目调研及市场前景预测评估报告
- 难治性痛风中西医结合诊疗专家共识解读 4
- 献县地热管理办法
- 教育测量与评价 课件全套 朱德全 第1-15章 教育测量与评价概述- 教育测评结果的统计处理
- 财务共享模式下中储粮财务集中管理研究
评论
0/150
提交评论