多线程技术及其实现.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多线程技术及其实现

2003 年第 3 期                                  软件天地 多线程技术及其实现 徐洪斌  苏铁熊  董小瑞 (华北工学院机械电子工程系 ,山西 太原 030051) 摘  要 :介绍了多线程的来历以及多线程的同步与互斥 ,然后讲述了利用 VC + + 进行多线程编程的过程 ,最 后用一个例子对多线程编程方法作了分析 。 关键词 :进程 ;线程 ;多线程 ;同步 ;互斥 中图分类号 : TP31   文献标识码 :A 引言 提到多线程 ,就应想到进程 ,因为进程是系统分配资源 的单位 ,它为线程的运行提供了一个运行环境 。在以前只有 进程的操作系统中 ,进程是处理器调用的对象 。但是 ,多个 进程并发时 ,进程切换开销占的比重越来越大 ,而且进程之 间的通信效率也受到限制 。所以为了提高进程的并发处理 效率与减少开销 ,就引入了线程的技术 。此时 ,线程成了处 理器调度的对象 ,而进程只是作为资源的分配单位 。多线程 的引入 ,大大改善了计算机的运行效率 ———减少了并发执行 的时间和空间开销 。因为 ,同一进程内的各线程都可以访问 就不会造成错误的结果 。此既为同步的作用 。 1 . 2  多线程的互斥 互斥是指由于多个线程共享一个资源所要求的排它性 , 进程间要互相竞争 。 例如 :售票系统程序示例如下 : while ( 1) {if ( ticket 0) { Sleep (10) ; ticket - - ; 整个进程的所有资源 ,所以各线程间的通信更为方便 ; 而且 p rintf “( %d \ n”,ticket) }} 同一进程的许多线程由于部分上下文相同而不用大量的切 换 。但是 ,多线程是一把双刃剑 ,用好了可以提高你的程序 设计水平 ,用不好会让你陷入麻烦 。所以下面 ,就谈一谈如 何用信号量与 P 、V 原语的方法实现线程的同步与互斥 ,最 后过度到具体的编译环境 VC 的多线程编程技术 。 1  多线程的同步与互斥 1 . 1  多线程的同步 何谓同步 ,如果有 VC 编程经验的人 ,不会陌生两个发 送消息的函数 。Post Message ( ) 与 SendMessage ( ) 。Post Mes2 sage ( ) 是消息发过去 ,送到应用程序时 ,消息队列 。此消息 的响应函数并不一定马上执行 ,此既为异步 。而 SenMessage () 把消息发过去 。并不放到消息队列等应用程序来取 ,而是 响应函数马上执行 。此既为同步 。异步不在讨论之例 。我 只想谈谈同步 。那么同步作用是干什么呢 ? 我们知道 ,在线 程体内 ,如果该线程完全独立 ,与其它的线程没有数据存取 筹资源操作上的冲突的话 ,可以按照通常单线程的方法进行 编程 ,但是在处理多线程时情况常常不是这样 ,线程之间常 要同时去访问同一块资源 ,例如 ,一个线程负责公式计算 ,另 一线程负责结果的显示不正确的结果 。此时 ,如果负责管理 计算的线程 ,在计算完时 ,给打印线程发一个消息 ———已打 印完成 ,可以取出 。此时的打印线程才再去访问那个变量 。 此段代码是多个线程要访问的临界区 ,其中 ,ticket 变量 为当前的票数 。并假想当前只剩一张票的情形 ,如果一个访 问线程 A 正在购票 ,发现 tichet 0 ,但此时此线程 A 系统分 配的时间片已到 。操作系统就把 CPU 的占有权分给另一线 程 B 。B 线程也发现 ticket 0 于是执行了下面的操作 , ( ticket —) 语句 。而此时线程 A 被调度时 ,但其的上下文中 保存的还是上次让出 CPU 占有权时的记录 。所以保持着 ticket 0 。结果它又执行了一次 ( ticket —) 句 。所以出现了 打印出来的 ticket 为负数的错误结果 。此时 ,就应到互斥的 方法 。 1 . 3  信号量与 P 、V 原语实现进程的同步和互斥 信号量和 P 、V 原语的概念是荷兰学者 E. W. Dijkst ra 于 1965 年提出来的 。其中 , 信号量是一个整数 。当其大于零 时 ,表示有资源可用 ,当小于零时 ;其绝对值表示当前等待临 界区的进程数 。注意 ,我们所建的信号量必须说明其所代笔 的意义 ,和赋初值 。PV 原语的执行 ,不受进程调度和执行的 打断 ,从而很好的解决了原语操作的整体性的问题 。 1 . 3 . 1  下面用 P 、V 实现上面售票系统的互斥 设 s 为互斥信号量 ,其初值为 1 ,取值范围为 ( 1 ,0 , - 1) 。 当 s = 1 时表示线程 A 和线程 B 都未进入临界区 , s = 0 时表 示线程 A 或线程 B 中的

文档评论(0)

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

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

1亿VIP精品文档

相关文档