版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十七讲:线程同步与进程通信,e-mail:,课程内容安排,进程和线程 MFC的线程处理 线程同步 进程通信 综合练习 思考和习题,进程和线程,读者在使用32位Windows操作系统如Windows XP时,能够同时运行几个程序。这种能力称为多任务处理。多任务其实就可以理解为系统可以同时运行多个进程。 进程(Process)是一个运行的程序,其由独立的虚拟内存、代码、文件句柄和其他系统资源组成。简单的说,进程是操作系统分配内存地址空间的基本单位。 线程(Thread)是操作系统分配处理器时间的最小单元。一个进程必须包含一个线程,称之为主线程。进程中的线程是并行执行的。每个线程占用CPU的时间由
2、系统来划分。,假如有一个公司,公司里有很多各司其职的职员。那么读者可以认为这个正常运作的公司就是一个进程,而公司里的职员就是线程。一个公司至少得有一个职员。同理,一个进程至少包含一个线程。在公司里,一个职员可以干所有的事,但是效率很显然不会很高,这就需要引入多线程了。一个公司(进程)中包含多个各负其责的职员(线程),如图17-1所示。,MFC的线程处理,总的来说,Win32 API提供的线程处理的接口,但其引用较为复杂。因此,在Win32 API的基础上,MFC提供了处理线程的类和函数。其中,MFC提供处理线程的类为CWinThread类。CWinThread类使用线程本地存储来管理在MFC环
3、境中的线程的上下文信息。,一般的说,用户可以直接声明CWinThread对象,但在许多情况下,可以让MFC的全局函数AfxBeginThread()来创建CWinThread对象。CWinThread类提供了几个函数来对线程进行操作。例如: CWinThread: AfxBeginThread()函数:用来创建进程。 CWinThread:CreateThread()函数:用来启动新的线程。 CWinThread:SuspendThread()函数:用来挂起线程。 CWinThread:ResumeThread()函数:用来恢复线程的执行。 MFC中支持两种类型的线程:工作者线程和用户界面线程
4、。其区别在于:工作者线程常用于完成不要求用户输入的任务,如耗时计算、后台打印之类的任务。因此,其不需要有界面。,创建工作者线程,工作者线程可以说是并行执行的一个函数,其一般用来完成那些不需要用户输入的后台任务。例如数据库备份功能和网络联接状态监视等功能。 简单的说,创建一个工作者线程就是实现一个控制函数,并将其地址传给适当的形式的AfxBeginThread()函数的问题。一般的说,工作者线程形式的AfxBeginThread()的声明的格式如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID p
5、Param, int nPriority, UINT nStackSize, DWORD dwCreateFlags, LPSECURITY_ATTRIBUTES lpSecurityAttrs );,例如,下面语句创建了一个工作者线程,其中指定线程的入口函数地址为function()函数的地址。 UINT function(LPVOID pParam ) while(true) printf(Welcome to 21 Visual C+); Sleep(1000); printf(t); return 0; AfxBeginThread(function, NULL);/用于创建工作者线程
6、,创建用户界面线程,与工作者线程不同的是,用户界面线程通常用于处理用户的输入,响应用户产生的消息。为了建立一个用户界面线程,需要从CWinThread引出自定义的类,并将该类的运行时信息传给用户界面形式的AfxBeginThread()函数,以便创建用户界面线程。 一般说来,用户界面线程的创建过程一般需要先从基类CWinThread中派生出用户自定义的新类,再使用AfxBeginThread()函数创建线程。,线程同步,在有若干个线程并行运行的环境里,不同线程之间的同步是非常重要的。此处需要读者注意的是,此处的同步并不是指日常生活中说的两件事情同步,表示将两件事情同时来做,程序设计中的线程同步
7、的目的是避免多个线程同时进行某些操作,使多个线程之间协调工作。 比如在一座独木桥上,只能允许一个人通过,这时有两个方向相反的人要过桥。如果两个人同时要过桥,那么谁都不能过去,都会被阻塞在桥上。而线程同步就是要解决这个问题,一个时间段中只允许一个人对桥这个资源拥有控制权,如图17-7所示。,线程同步概述,在实际的多线程程序中,经常出现一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解或操作,正常情况下对这种处理结果的了解应当在其处理任务完成后进行,而很多时候该线程的任务并未完成。如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到错误的结果。 在
8、程序设计中,为了解决这个问题,或者说为了确保读线程读取到的是经过修改的变量,就必须在向变量写入数据时禁止其他线程对其的任何访问,直至赋值过程结束后再解除这种限制。这种为保证线程正确的处理结果而采取的保护措施即为线程同步。,线程同步在Visual C+中的实现形式有很多种,为简单起见,此处只介绍最简单的一种同步对象:关键代码段。 关键代码段也称为临界区,其是一种最简单的同步对象。关键代码段只可以被单个进程内的线程使用,其作用是保证只有一个线程可以申请到该对象。因此,可以让所有的线程都共享同一个关键代码段对象。 读者可以看出,关键代码段类似于商场中的一个试衣间。同一时间只能有一个人进去。而另一个人
9、若想进去,只有等到上一个人出来,将试衣间空出来才可以,如图17-8所示。,关键代码段,进程通信,操作系统中实现同一台机器上的不同进程之间的通信是非常重要的。一般来说,进程间的通信方法有3种:剪贴板、邮槽和管道。,剪贴板,在读者的印象中,通常认为剪贴板是传输数据的媒介,用户要复制的数据首先保存到剪贴板中。这种想法不能说是正确的。因为实际上要复制的数据并不是真的保存在剪贴板上,而是在一块内存区域中。而剪贴板同这块内存区域相关联。或者说,由剪贴板来管理这块内存区域。例如,这里要将进程A中的内容通过剪贴板复制到进程B中,大致遵循以下步骤。 (1)在进程A自己的4GB的地址空间中申请一块内存。 (2)把
10、要复制的数据写到申请的内存块当中;再把内存块交给剪贴板管理器中。 (3)进程B由剪贴板中取出数据,如图17-14所示。,例如,下列语句从已连接的套接字上接收一个字符串,并将其放入字符串变量mm中。 char aa100; CString mm; CSocket:Receive(void*)aa,100,0); mm=aa;,剪贴板通信实例,为了更好地理解以上讲述的函数,下面给出一个实例来详细地介绍如何使用剪贴板来实现进程间的通信。,综合练习,实现一个多线程程序,其实现功能为:单击【启动】按钮后,系统当前时间将显示在文本框中,并实时更新。单击【停止】按钮后,时间停止,如图17-20所示。,思考和习题,简述线程与进程的概念,并
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度数据中心运营维护承包人工合同模板4篇
- 2025年度互联网数据中心搭建服务合同协议3篇
- 2025年度化工原料采购与储存协议3篇
- 2025年度环保型绿色打印设备承包合同范本3篇
- 2025年度汽车4S店集团购车优惠及售后服务协议3篇
- 2024衣柜墙板吊顶装修工程施工安全与环境保护合同
- 创新集成电路设计与制造技术项目可行性研究报告范文模板
- 《融资租赁行业培训》课件
- 2025年度房产中介服务佣金结算标准合同4篇
- 2025年度别墅装修工程承包与监理协议4篇
- 二零二五年度数据存储与备份外包服务协议2篇
- 家政服务与社区合作方案
- 2024年深圳市龙岗区城市建设投资集团有限公司招聘笔试真题
- 2024-2025学年北京市朝阳区高三上学期期末考试数学试卷(含答案)
- 第五单元《习作例文:风向袋的制作》说课稿-2024-2025学年五年级上册语文统编版
- 四年级数学(除数是两位数)计算题专项练习及答案
- 四川省绵阳市涪城区2024-2025学年九年级上学期1月期末历史试卷(含答案)
- 2025年山东水发集团限公司社会招聘高频重点提升(共500题)附带答案详解
- JJG 1204-2025电子计价秤检定规程(试行)
- 2024年计算机二级WPS考试题库(共380题含答案)
- 《湖南省房屋建筑和市政工程消防质量控制技术标准》
评论
0/150
提交评论