c#网络应用编程进程与线程.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.4 线程同步与线程池 2.4.1 线程的优先级 2.4.2 线程同步 2.4.3 lock语句 2.4.4 线程池 2.4.1 线程的优先级 五个优先级,由高到低分别是:Highest、AboveNormal、 Normal(默认)、BelowNormal和Lowest 可以使用下面的方法为其赋予较高的优先级: Thread t = new Thread(MethodName); t.priority = ThreadPriority.AboveNormal; 通过设置线程的优先级可以改变线程的执行顺序,所设置的优先级仅仅适用于这些线程所属的进程。 注意: 当把某线程的优先级设置为Highest时,系统正在运行的其他线程都会终止,所以使用这个优先级别时要特别小心。 2.4.2 线程同步 同步 指多个线程之间存在先后执行顺序的关联关系。 哪些资源需要同步 系统资源(如通信端口) 多个进程所共享的资源(如文件句柄) 由多个线程访问的单个应用程序域的资源(如全局、静态和实例字段) 2.4.2 线程同步 为什么要同步 当两个线程t1和t2有相同的优先级,并且同时在系统上运行时,如果先把时间片分给t1使用,它在结构s1中(该结构中有多个变量)写入某些值,但如果在时间片用完时它仍没有完成写入,这时由于时间片已经分给t2使用,而t2又恰好要尝试读取该结构的值,此时读出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用s1,在该线程完成对s1的写入工作后再让t2读取这个结构值,就可以避免出现此类错误。 2.4.2 线程同步 解决方法: System.Threading命名空间提供了多个用于同步线程的类这些类包括Mutex、Monitor、Interlocked和AutoResetEvent。 在实际应用中经常使用lock语句完成线程同步。 该语句简化了编程的复杂性,使程序看起来既清晰又简洁 2.4.3 lock语句 lock语句的功能 lock语句可以有效地实现同步,即将代码段(语句块)标记为临界区。它能确保当一个线程位于代码的临界区(可以理解为一段代码)时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码段,则它将一直等待(即被阻塞),直到锁定的对象被释放以后才能进入临界区。 lock语句的用法 首先利用lock语句锁定某一个对象,然后执行代码段中的语句,等代码段中的语句执行完毕后,再释放该对象。 private Object obj = new Object(); …… lock(obj) { //临界区中的代码 } 2.4.3 lock语句(续) 使用lock语句应注意的问题: 锁定的对象名(上面代码中的obj)一般声明为Object类型,不要将其声明为值类型。 锁定的对象名不能将其声明为public,只能为private 临界区中的代码一般不宜太多。 程序举例【例2-4】 【例2-4】lock语句用法举例:多线程随机取款。 (相当于某公司派多人在多台自动取款机上同时取款) 运行效果:(lockExample) 正确的运行结果 错误的运行结果 2.4.4 线程池 背景: 1)无限制的创建线程消耗系统资源 2)创建线程、回收线程均需要时间 线程池:是在后台执行多个任务的线程集合。 1)最大线程数限制。如果所有线程都繁忙,则额外的任务将放入等待队列中,直到有线程可用时才能够得到处理。 2)最小线程数=创建线程池时应立即启动的数目 3)一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以避免为每个任务创建新线程引起的资源和时间消耗。 4)一项工作任务被加入到线程池的队列中,就不能取消该任务,直到该任务完成。 2.4.4 线程池(续) 线程池的默认大小:每个可用处理器25个线程。 每个进程都有一个线程池。 为什么要用线程池? 降低系统开销 可以重用资源,使应用程序可以避免为每个任务创建新线程引起的资源和时间消耗。 什么情况下才使用线程池? 后台执行,而且不同线程没有优先级区别 适用于需要多个线程而实际执行时间又不多的场合 没有导致线程长时间被阻塞的任务(对于可能长时间被阻塞的任务,应该创建单独的线程处理,不应该使用线程池),这是因为线程池具有最大线程数限制,大量阻塞的线程池线程可能会阻止任务启动 2.4.4 线程池(续) ThreadPool类位于System.Threading命名空间下。 ThreadPool提供了对线程池的操作(静态方法),例如:发送工作项、处理异步I/O、设置线程数目等 ThreadPool是一个静态类 托管线程

文档评论(0)

yingzhiguo + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档