好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

CVI中的多线程技术.pdf

10页
  • 卖家[上传人]:油条
  • 文档编号:13017742
  • 上传时间:2017-09-04
  • 文档格式:PDF
  • 文档大小:295.72KB
  • / 10 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1/10 LabWindows™/CVI 中的多线程技术1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 概览多核编程基础系列 白皮书多任务、多线程 和多处理这些术语经 常被交替地使用,但 是它们在本质上是不 同的概念多任务是 指操作系统具有在任 务间快速切换使得这 些任务看起来是在同 步执行的能力在一个抢占式多任务系统 中,应用程序可以随 时被暂停使用多线 程技术,应用程序可 以把它的任务分配到 单独的线程中执行 在多线程程序中,操 作系统让一个线程的 代码执行一段时间(被称为时间片) 后,会切换到另外的 线程继续运行暂停 某个线程的运行而开 始执行另一个线程的 行为被称为线程切 换通常情况下,操 作系统进行线程切换 的速度非常快,令用户觉得有多个线程在 同时运行一样多处 理指的是在一台计算 机上使用多个处理 器在对称式多处理 (SMP)系统中, 操作系统自动使用计 算机上所有的处理器 来执行所有准备运行的线程借助于多处 理的能力,多线程应 用程序可以同时执行 多个线程,在更短的 时间内完成更多的任 务单线程应用程序移 植到多核处理器上运 行不会获得性能上的 改进,这是因为它们 只能在其中一个处理 器上运行,而不能像 多线程应用程序那样 在所有的处理器上同 时运行。

      而且单线程应用程序需要承受操 作系统在处理器间切 换所需要的开销为 了在多线程操作系统 和/或多处理器计算 机上获得最优异的性 能,我们必须使用多 线程技术来编写应用 程序目录进行多线程编程的原 因选择合适的操作系统LabWindows/CVI 中的多线程技术简介在 LabWindows/CVI 的辅助线程中运行代 码保护数据避免死锁监视和控制辅助线 程进程和线程优先级消息处理使用线程局部变量程局部变量中 存储动态分配的数据在独立线程中运行 的回调函数为线程设定首选的 处理器额外的多线程技术 资源进行多线程编程的原 因在程序中使用多线程 技术的原因主要有四 个最常见的原因是 多个任务进行分割, 这些任务中的一个或 多个是对时间要求严 格的而且易被其他任 务的运行所干涉例 如,进行数据采集并显示用户界面的程序 就很适合使用多线程 技术实现在这种类 型的程序中,数据采 集是时间要求严格的 任务,它很可能被用 户界面的任务打断 在 LabWindows/CVI 程序中使用单线程方法时,程序员可能需 要从数据采集缓冲区 读出数据并将它们显 示到用户界面的曲线 上,然后处理事件对 用户界面进行更新。

      当用户在界面上进行 操作(如在图表上拖 动光标)时,线程将继续处理用户界面事 件而不能返回到数据 采集任务,这将导致 数据采集缓冲区的溢 出而在 LabWindows/CVI 程序中使用多线程技 术时,程序员可以将 数据采集操作放在一 个线程中,而将用户界面处理放在另一个 线程中这样,在用 户对界面进行操作 时,操作系统将进行 线程切换,为数据采 集线程提供完成任务 所需的时间在程序中使用多线程 技术的第二个原因是 程序中可能需要同时 进行低速的输入/输 出操作例如,使用 仪器来测试电路板的 程序将从多线程技术 中获得显著的性能提 升在 LabWindows/CVI程序中使用单线程技 术时,程序员需要从 串口发送数据,初始 化电路板程序需 要等待电路板完成操 作之后,再去初始化 测试仪器必须要等 待测试仪器完成初始 化之后,再进行测 量,在LabWindows/CVI 程序中使用多线程技 术时,你可以使用另 一个线程来初始化测 试仪器这样,在等 待电路板初始化的同 时等待仪器初始化 低速的输入/输出操 作同时进行,减少了等待所需要的时间总 开销在程序中使用多线程 技术的第三个原因是 借助多处理器计算机 来提高性能。

      计算机 上的每个处理器可以 都执行一个线程这 样,在单处理器计算 机上,操作系统只是 使多个线程看起来是同时执行的,而在多 处理器计算机上,操 作系统才是真正意义 上同时执行多个线程 的例如,进行数据 采集、将数据写入磁 盘、分析数据并且在 用户界面上显示分析 数据,这样的程序很可能通过多线程技术 和多处理器计算机运 行得到性能提升将 数据写到磁盘上和分 析用于显示的数据是 可以同时执行的任 务在程序中使用多线程 技术的第四个原因是 在多个环境中同时执 行特定的任务例 如,程序员可以在应 用程序中利用多线程 技术在测试舱进行并 行化测试使用单线 程技术,应用程序需要动态分配空间来保 存每个舱中的测试结 果应用程序需要手 动维护每个记录及其 对应的测试舱的关 系而使用多线程技 术,应用程序可以创 建独立的线程来处理 每个测试舱然后,应用程序可以使用线 程局部变量为每个线 程创建测试结果记 录测试舱与结果记 录间的关系是自动维 护的,使应用程序代 码得以简化选择合适的操作系统微软公司的 Windows 9x系列操作系统不 支持多处理器计算 机所以,你必须在 多处理器计算机上运 行Windows Vista/XP/2000/NT 4.0系统来享受多 处理器带来的好处。

      而且,即使在单处理器计算机上,多线程 程序在 Windows Vista/XP/2000/NT 4.0上的性能也比 在Windows 9x上好这要归功 于Windows Vista/XP/2000/NT 4.0系统有着更为 高效的线程切换技 术但是,这种性能上的差别在多数多线 程程序中体现得并不 是十分明显对于程序开发,特别 是编写和调试多线程 程序而言, Windows Vista/XP/2000/NT 4.0系列操作系统 比Windows 9x系列更为稳定, 当运行操作系统代码 的线程被暂停或终止 的时候,操作系统的一些部分有可能出于 不良状态中这种情 况使得 Windows 9x操作系统崩溃的 几率远远高于 Windows Vista/XP/2000/NT 4.0系统的几率 所以,NI公司推荐 用户使用运行 WindowsVista/XP/2000/NT 4.0操作系统的计 算机来开发多线程程 序LabWindows/CVI 中的多线程技术简介NI LabWindows/CVI 软件自二十世纪九十 年代中期诞生之日起 就支持多线程应用程 序的创建现在,随 着多核CPU的广泛 普及,用户可以使用 LabWindows/CVI 来充分利用多线程技 术的优势。

      与Windows SDK threading API (Windows 软件开发工具包线程 API)相比, LabWindows/CVI 的多线程库提供了以 下多个性能优化:Thread pools帮助用户将函数调度 到独立的线程中执 行Thread pools处理线程 缓存来最小化与创建 和销毁线程相关的开 销Thread- safe queues对线程间的数据传递 进行了抽象一个线 程可以在另一个线程 向队列写入数据的同 时,从队列中读取数 据Thread- safe variables高效地将临界代码段 和任意的数据类型结 合在一起用户可以 调用简单的函数来获 取临界代码段,设定 变量值,然后释放临 界代码段 文件类型 技术指南 : 是 是否NI支持: Apr 18, 2011 发布日期2/10 Thread- safe variables高效地将临界代码段 和任意的数据类型结 合在一起用户可以 调用简单的函数来获 取临界代码段,设定 变量值,然后释放临 界代码段Thread locks提供了一致的API 并在必要时自动选择 合适的机制来简化临 界代码段和互斥量的 使用例如,如果需 要在进程间共享互斥 锁,或者线程需要在 等待锁的时候处理消 息,LabWindows/CVI 会自动使用互斥量。

      临界代码段使用在其 它场合中,因为它更 加高效Thread- local variables为每个线程提供变量 实例操作系统对每 个进程可用的线程局 部变量的数量进行了 限制 LabWindows/CVI 在实现过程中对线程 局部变量进行了加 强,程序中的所有线程局部变量只使用一 个进程变量可以在 下的 LabWindows/CVI 库函数树状图中找到 所有的多线程函数Utility Library» Multithreading在 LabWindows/CVI 的辅助线程中运行代 码单线程程序中的线程 被称为主线程在用 户告诉操作系统开始 执行特定的程序时, 操作系统将创建主线 程在多线程程序 中,除了主线程外, 程序还通知操作系统 创建其他的线程这些线程被称为辅助线 程主线程和辅助线 程的主要区别在于它 们开始执行的位置 操作系统从main 或者WinMain 函数开始执行主线 程,而由开发人员来 指定辅助线程开始执 行的位置在典型的 LabWindows/CVI 多线程程序中,开发 者使用主线程来创 建、显示和运行用户 界面,而使用辅助线 程来进行其它时间要 求严格的操作,如数 据采集等。

      LabWindows/CVI提供了两种在辅助进 程中运行代码的高级 机制这两种机制是 线程池 (thread pools)和异步 定时器线程池适合 于执行若干次的或者 一个循环内执行的任 务而异步定时器适合于定期进行的任 务使用线程池为了使用 LabWindows/CVI 的线程池在辅助线程 中执行代码,需要调 用Utility Library中的 CmtScheduleThreadPoolFunction 函数将需要在辅助 线程中运行的函数名 称传递进来线程池将这个函数调度到某 个线程中执行根据 配置情况和当前的状 态,线程池可能会创 建新的线程来执行这 个函数、也可能会使 用已存在的空闲进程 执行函数或者会等待 一个活跃的线程变为空闲然后使用该线程 执行预定的函数传 递给 CmtScheduleThreadPoolFunction 的函数被称为线程函 数线程池中的线程 函数可以选择任意的 名称,但是必须遵循 以下原型:int CVICALLBACK ThreadFunction (void *functionData);下面的代码显示了如 何使用 CmtScheduleThreadPoolFunction 函数在辅助进程中执 行一个数据采集的线 程。

      int CVICALLBACK DataAcqThreadFunction (void *functionData);int main (int argc, char *argv[]){int panelHandle;int functionId;if (InitCVIRTE (0, argv, 0) == 0)return -1; /* out of memory */if ((panelHandle = LoadPanel (0, "DAQDisplay. uir", PANEL)) data [safeBufPtr- >count] = val;safeBufPtr- >count++;ReleasePointerToSafeBuf();}检测对 GetPointerToVarName 的不匹配调用可以通过 DefineThreadSafeScalarVar DefineThreadSafeArrayVar maxGetPointerNestingLevel 0 GetPointerToVarName GetPointerToVarName ReleasePointerToVarName run- time error ReleasePointerToCount int IncrementCount (void){int *countPtr;countPtr = GetPointerToCo。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.