- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Ch14.多线程编程技术
第14章 多线程编程技术 线程处理的基本概念 C#应用程序主线程 创建、启动、暂停和中断线程 线程优先级和线程调度 线程状态和生命周期 线程同步处理 线程池 14.1 线程处理概述 进程是操作系统中正在执行的不同应用程序的一个实例,操作系统把不同的进程分离开来 线程是操作系统分配处理器时间的基本单元,每个线程都维护异常处理程序、调度优先级和一组系统用于在调度该线程前保存线程上下文的结构 每个应用程序域都是用单个线程启动的(应用程序的入口点Main方法),应用程序域中的代码可以创建附加应用程序域和附加线程 14.1.2线程的优缺点 线程处理使程序能够执行并发处理,因而特别适合需要同时执行多个操作的场合 多线程处理可解决用户响应性能和多任务的问题,但同时引入了资源共享和同步问题等问题 14.2创建多线程应用程序 应用程序运行时,将创建新的应用程序域。当运行环境调用应用程序的入口点(Main方法)时,将创建应用程序主线程 【例14.1】C#应用程序主线程示例 14.2.2创建和启动新线程 主线程以外的线程一般称之为工作线程。创建新线程的大致步骤如下: 创建一个将在主线程外执行的函数,即类的方法,用于执行新线程要执行的逻辑操作 在主线程(Main方法)中创建一个Thread的实例,指向步骤1中的函数。例如:Thread newThread = new Thread(anObject.AMethod) 调用步骤2中创建的Thread的实例的Start()方法,以启动新线程。例如:newThread.Start() 【例14.2】创建和启动新线程示例 14.2.3暂停、中断和销毁线程 调用Thread.Sleep方法会导致当前线程立即阻止,阻止时间的长度等于传递给Thread.Sleep 的毫秒数。注意:一个线程不能针对另一个线程调用Thread.Sleep。 【例14.3】暂停线程示例 通过对被阻止的线程调用Thread.Interrupt,可以中断正在等待的线程并引发ThreadInterruptedException,从而使该线程脱离造成阻止的调用。 【例14.4】中断线程示例 Abort 方法用于永久地停止也即销毁托管线程。调用Abort时,公共语言运行库在目标线程中引发 ThreadAbortException,目标线程可捕捉此异常。 【例14.5】销毁线程示例 14.3线程优先级和线程调度 每个线程都有一个分配的优先级,在运行库内创建的线程最初被分配 Normal 优先级。通过线程的Priority属性可以获取和设置其优先级 表14-1 线程优先级值 【例14.6】线程优先级和线程调度示例 14.4线程状态和生命周期 线程的生命周期中包括各种执行状态 表14-2 线程的执行状态 通过执行相应的操作,线程可以转换为对应的状态 表14-3 线程操作及操作后的状态 14.5线程同步 当多个线程可以调用单个对象的属性和方法时,一个线程可能会中断另一个线程正在执行的任务,使该对象处于一种无效状态。因此必须针对这些调用进行同步处理 使用lock语句同步代码块 使用监视器同步代码块 14.5.2使用lock语句同步代码块 lock语句使用lock关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。lock关键字可以确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。代码块完成运行,而不会被其他线程中断 lock语句以关键字lock开头,并以一个对象作为参数,在该参数的后面为线程互斥的代码块 【例14.7】使用lock语句同步代码块示例 14.5.3使用监视器同步代码块 使用监视器(Monitor)也可以防止多个线程同时执行代码块。调用Monitor.Enter方法,允许一个且仅一个线程继续执行后面的语句;其他所有线程都将被阻止,直到执行语句的线程调用Exit 14.5.4同步事件和等待句柄 同步事件允许线程通过发信号互相通信,从而实现线程需要独占访问的资源的同步处理控制 同步事件有两种:AutoResetEvent(自动重置的本地事件)和 ManualResetEvent(手动重置的本地事件) 每种事件又包括两种状态:收到信号状态(signaled)和未收到信号状态(unsignaled) 【例14.8】同步事件和等待句柄示例1 【例14.9】同步事件和等待句柄示例2 14.5.5使用Mutex同步代码块 mutex(mutually exclusive,互斥体)由 Mutex 类表示,与监视器(Monitor)类似,用于防止多个线程在某一时间同时执行某个代码块 与监视器不同的是,mutex 可以用来使跨进程的线程同步。尽管
文档评论(0)