版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LabWindows/CVI教程(8) 多线程程序设计 主讲:乔立岩 Email: (交作业) MSN: (在线交流) Tel: 86413532 ext. 8611 (逸夫楼611),2020/8/20,1. 线程和进程,进程常被定义为应用程序的运行实例。 线程是指进程内部的可独立执行的单元,是操作系统对系统资源的基本调度单位。 每个进程至少拥有一个线程,这个线程被称为主线程(main thread) 。 一个进程也可以拥有多个线程,同属于一个进程的所有线程都共享进程的虚拟地址空间,线程之间可以共享进程的全局数据和资源。,2020/8/20,2. 多线程程序(Multi-Threading
2、),多线程程序就是在同一个时间段内至少有两个线程在执行程序代码的程序。 在多线程程序中,程序自己让操作系统创建主线程之外的其它线程,这些线程被称作次线程。(secondary thread) 次线程和主线程的主要差别就在于线程在何处开始执行。主线程一般开始执行程序的main或WinMain函数;程序开发者确定每一个次线程开始执行的函数。 操作系统允许一个特定线程执行的时段被称作一个时间片(time-slice)。 操作系统暂停一个线程的执行,转而允许另一个线程执行它的时间片的行为被称作线程切换(thread-switch)。,2020/8/20,3. 多线程的优点,改善吞吐量,避免阻塞 提高响
3、应速度和更有效的后台处理 减少运行过程和用户界面的相互影响 最大程度利用多处理器的性能,2020/8/20,4. 两种多线程机制,异步定时器 适用于在固定时间间隔内执行的任务 调用toolslib.fp函数NewAsyncTimer,把想要在次线程中执行的函数名称传递给它,并且设定每次函数执行的时间间隔 int NewAsyncTimer (double Interval, int Count, int Initial_State, void *Event_Function, void *Callback_Data); int CVICALLBACK FunctionName (int res
4、erved, int timerId, int event,void *callbackData, int eventData1, int eventData2); toolslib库使用一个多媒体定时器线程执行注册在一个程序里的所有异步定时器回调,因此,如果想要在程序里并行执行多个函数, 建议使用线程池函数,2020/8/20,4. 两种多线程机制(2),线程池 (thread pools) 适用于需要不连续地执行多次或在循环中执行的任务 调用实用库(Utility Library)中的CmtScheduleThreadPoolFunction函数,把想要在次线程中执行的函数名传递给它,线程
5、池调度这个函数在它的其中一个线程中运行。 int CmtScheduleThreadPoolFunction (int poolHandle, ThreadFunctionPtr threadFunction, void *threadFunctionData, int *threadFunctionID); int CVICALLBACK ThreadFunction (void *functionData);,2020/8/20,int CVICALLBACK DataAcqThreadFunction (void *functionData); int main(int argc, ch
6、ar *argv) int panelHandle; int functionId; if (InitCVIRTE (0, argv, 0) = 0) return -1; /*内存溢出 */ if (panelHandle = LoadPanel(0, DAQDisplay.uir, PANEL) 0) return -1; DisplayPanel (panelHandle); CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, DataAcqThreadFunction, NULL, ,2020/8/20,5. 多线程间的
7、数据保护,为什么要保护数据 如果一个变量被多个线程访问,必须保护它以确保它的数值不被破坏 需要保护的数据种类 在程序中只有多个线程访问的变量才必须需要保护。全局变量、静态局部变量和动态分配的内存位于公共内存区域,可以被程序中的所有线程访问,存放在这类内存区域中的数据必须保护以免多个线程同时访问。 函数参数和非静态局部变量位于堆栈中,操作系统为每个线程分配了单独的堆栈,每个线程因此获得自己的参数和非静态局部变量的拷贝,所以参数和非静态局部变量不需要保护。,2020/8/20,5. 多线程间的数据保护(2),如何保护数据 线程锁(thread lock) 简单,容易出现阻塞和死锁,效率低 线程安全
8、变量(thread safe variables) 安全,不容易出错 线程安全队列(thread safe queues) 线程安全队列是为多个线程之间传递大批数据提供的一种机制。通常在程序中有一个线程产生一批数据,另一个线程需要操作这批数据的情况下会用到线程安全队列。 例如,程序的一个线程用DAQ采集数据,而另一个线程分析或者在LabWindows/CVI的用户界面显示这些数据。,2020/8/20,int queue; int panelHandle; int main (int argc, char *argv) if (InitCVIRTE (0, argv, 0) = 0) retu
9、rn -1; /* out of memory */ if (panelHandle = LoadPanel(0, DAQDisplay.uir“, PANEL) 0) return -1; /*创建一个容纳1000个双精度数据的队列,需要的时候还可以扩大*/ CmtNewTSQ(1000, sizeof(double), OPT_TSQ_DYNAMIC_SIZE, ,2020/8/20,6. 线程的优先级,Windows允许定义每个进程和线程中的工作的相对重要性,也就是优先级。 如果设定一个进程或进程中的线程一个较高的优先级,这个进程或线程就比其它较低优先级的线程获得更大的优先权。这意味着当有多个线程准备运行时,允许最高优先级的线程先运行。 Windows把优先级分成若干等级,所有在同一个进程中的线程拥有相同的优先等级。进程中的每一个线程都有一个相对于这个进程的优先等级的优先级。,2020/8/20,7. 线程局部变量,线程局部变量和全局变量有些相似,它们都可以被任何线程访问。 线程局部变量为每一个线程的访问保存独立的数值,而全局变量为所有线程保存单一的数值。 程序同时在多个环境下执行一种特定的任务,为每一种环境派生出一个独立的线程。例如,设计一个并行测试器的程序,为处理每一个被测设备派生一个线程,可以用线程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省无锡外国语校2024届初中英语毕业考试模拟冲刺卷含答案
- 二年级数学100以内加减法竖式计算题水平监控口算题大全附答案
- 2024全新个人佣金协议范本下载
- 2024-医疗聘用合同模板
- 2023-2024年消防劳务分包合同样本范本范本
- 2024年灯具玻璃项目经营分析报告
- 2024年馏份油中压加氢改质催化剂项目经营分析报告
- 2024年抗毒素类生物制品项目招商引资报告
- 湖南省永州市石羊镇中学高一英语下学期摸底试题含解析
- 2024年健康保健服务行业企业战略风险管理报告
- 化学中考模拟测试卷5份含答案
- 物业小区电梯安全培训内容
- 《技能成就梦想》课件
- 河北省石家庄市无极中学2024届高三第二次模拟考试英语试卷含解析
- 助产士的医疗法规与伦理准则培训指南
- 《额尔古纳河右岸》读书分享主题班会
- 尹庄中心小学财务管理内部控制手册
- 患者监护系统系统课程设计
- 空调、电视供货安装维护方案
- 小学生少先队知识讲座
- 2023上海闵行区九年级(五四学制)上学期中考一模语文试题及答案
评论
0/150
提交评论