软件开发过程中总会遇到需要多线程同步运行的情况,尤其是一些复杂的测试系统和大型项目,仅靠单线程运行的程序是远远无法满足用户需求的,甚至可以说在复杂测试系统的软件开发中,多线程运行是最基本的。
所以不论使用什么开发环境都需要工程师们掌握如何进行多线程编程。在多线程开发这一点上LabVIEW有其独到的优势,那就是LabVIEW是自动并行运行的语言,它可以自动多线程运行。
下面就小编就和大家浅谈一下LabVIEW的线程编程的相关知识吧!
本文教程:
LabVIEW多线程编程基础概念
一、单线程与多线程:
LabVIEW在5.0开始才支持多线程,在此之前,LabVIEW其实是单线程运行的。在了解LabVIEW多线程之前,我们需要了解单线程的含义:单线程并不是指代码固定在某个线程上一直执行,系统有可能也会将它切换到其他线程上去运行,但是在同一时刻它只会存在于单个线程中,不会有多个线程去同时运行这段代码。而多线程指的是在同一时刻系统可能会在多个线程中同时运行代码。
在LabVIEW中只要程序框图中的代码可以并行运行(功能模块之间没有连线关系,比如两个独立的While循环),那么LabIVEW在运行这段代码时就会自动将它们分配在多个线程内同时运行。
一般情况下,LabVIEW运行VI时至少会开辟两个线程,一个是负责刷新界面、响应用户操作控件等界面操作功能的用户界面线程;另外一个或多个线程是负责执行除界面操作以外的其他工作,称之为执行线程。
二、LabVIEW的多线程:
如下图所示,这是两个独立运行的While循环,这段代码在执行时会被LabVIEW自动分配到两个线程中去执行。
通过上面这个示例就可以看到,在LabIVEW中编写多线程程序十分简便。由于两个循环中没有延时函数,程序会十分快速地执行,所以对系统来说它们是两个较为繁重的线程,一般对于这种任务繁重的线程,多核CPU计算机还会将它们额外安排到不同的CPU内核上去运行。如下图所示,运行上述示例以后系统自动将它们分配到不同的内核中去运行,这样可以合理利用CPU资源,提高程序运行速度,节省程序执行时间,防止某个CPU内核被100%占用导致卡死。
三、LabVIEW的执行系统:
LabVIEW自己有一套调度系统,负责代码的调度和运行,这就是LabVIEW的执行系统。LabVIEW目前有六个执行系统,分别是:用户界面、标准、仪器I/O、数据采集以及其他1、其他2执行系统。一个应用程序中的众多子VI是可以分别放在不同的执行系统里运行的,用户可以在VI属性中指定VI的执行系统。
在LabVIEW支持多线程后,不同执行系统中的代码就被划分在了不同的线程下运行。其中用户界面执行系统只有一个线程,那就是一开始提到的用户界面线程;其他执行系统可以为代码开辟多个线程。
四、LabVIEW的VI优先级:
用户可以在VI属性中指定VI的优先级属性。LabVIEW VI优先级有后台、标准、高于标准、高、实时这六个档次。其中前五项是从低到高的优先级顺序,优先级越高越容易抢占到CPU资源。而子程序这一项比较特殊,当一个VI的优先级被设置为子程序时,VI前面板、调试信息会被移除(不能用作界面、不能调试),同时在执行该VI时应用程序会短暂变为单线程执行,即在这个VI执行结束之前,不会被别的线程打断;这意味着子程序的VI在执行时会得到最多的CPU资源,所以某些纯算法的VI,假如不是特别耗时就可以设置为子程序的优先级。
在设置VI优先级时需要注意:1、在一个应用程序中,提高一个VI的优先级并不能缩短应用程序整体占用CPU的时间,只是意味着这个VI会比其他VI更多、更容易抢占到CPU资源,所有VI占用CPU的整体时间是不会变的;2、低优先级相对于高优先级的VI,并不是高优先级的VI会一定先执行,只是说明高优先级VI有更高的概率抢占到CPU资源;
在单核CPU的计算机上,LabVIEW最多为每个执行系统下的每个档次优先级开启四条线程,如果是多核CPU,每增加一个CPU内核,可开辟的线程数目翻倍。实际上一个程序在运行时并不会有那么多优先级和执行系统设置,所以并不会开辟很多线程。
小编这里提醒大家编程时线程不是越多越好,因为线程的开辟、销毁、切换等都是需要消耗资源的,如果线程开的太多,切换线程太频繁,反而会导致程序执行的效率降低。
五、定时结构:
对于多核CPU的计算机,有时候操作系统自动分配线程至CPU内核的策略可能并不是最优解,于是就需要我们人工去指定,即某个线程应该被指定到计算机的哪个CPU内核上执行。现在绝大部分计算机的CPU性能都足够强大,所以一般情况下,只有对于执行效率要求极其苛刻的程序才会需要我们人工去指定CPU内核的分配方案。
需要人工指定CPU分配方案时,我们可以使用定时结构来替换程序中原有的结构,定时结构可以更加精确的执行某段程序代码,并且它还包含一些用于高精度定时、处理器分配等的辅助功能,定时结构包含定时循环结构和定时顺序结构,如下图所示:
可以看到相对于普通的循环或者顺序结构,定时结构左侧有一些输入端,可以进行一些配置,这些配置可以在程序运行过程中使用输入接线端进行动态设置,也可以在配置面板中静态进行设置,如下图所示:
在该配置面板中,处理器分配模式就是用来指定CPU的设置,可以将它选择为手动模式,然后在后面选择要分配的CPU内核名称即可。在实际应用中,我们可以将按照执行任务的耗时来划分,将耗时比较多的任务单独指定在一个CPU中,不同CPU中平衡分配任务,提升程序整体运行的速度。
六、并行循环
前面提到当两个循环并行运行,它们之间没有数据连线时LabVIEW会将它们划分到两个不同的线程中去执行。那么当只有一个循环时,一般情况下,LabVIEW只会为此循环开辟一个线程来执行,但是如果这个循环中的代码本身就比较耗时,那么这段代码的执行效率就会十分低,如下图所示:
上述示例中的这段代码执行一次需要859ms,属于相当耗时的代码了,它每次循环都需要经过大量数学运算,对于这种循环,可以将它配置成并行运行模式,在循环上右键并选择“配置循环并行”
选择之后就会看到一个配置窗口:
首先我们需要先勾选“启用循环迭代并行”,然后配置生成的并行循环实例数量,一般来说实例数最高设置成计算机的内核总数量,设置数量超过计算机的内核数量就没有意义了,不会再继续提高程序的运行速度。
上图是将原先的示例改为并行循环并设置了8个线程之后的执行情况,可以看到它的运行时间显著减少,程序的执行效率得到了很大的提升。
注意事项:
1、配置并行循环要求循环内部的代码不能依赖之前循环运算的结果(比如不能使用反馈节点和移位寄存器),因为如果程序依赖之前循环运算的结果就表明这个程序不能并行运行,必须强制迭代按顺序执行,如果强行配置为并行循环会导致VI报错无法运行。
2、配置为并行循环的程序无法在循环内部使用探针等调试手段,如果需要调试可以勾选配置循环并行面板中的“允许调试”,勾选之后它会强制所有并行的线程按照顺序迭代,这样会使并行运行的执行效率降低到之前的单线程运行的水平,所以一般代码调试完成后一定要记得取消此勾选项。
七、内容总结 1、明确LabVIEW单线程和多线程的概念; 2、了解LabVIEW自动多线程的相关知识; 3、熟悉LabVIEW执行系统的相关知识; 4、掌握LabVIEW VI优先级设置及其注意事项; 5、学习定时结构和并行循环的使用及注意事项; 以上就是有关LabVIEW多线程编程第一章节的所有内容啦,欢迎大家一起交流探讨!下一章小编将会为大家带来LabVIEW多线程之间的数据传递相关的分享,敬请期待! 编辑:黄飞
评论
查看更多