全局变量和功能全局变量
全局变量
全局变量与局部变量类似,是一种可以让数据随时流入流出其间的对象。它与局部变量的区别在于,局部变量只能在其对应控件所在的 VI 中使用,而全局变量可以在一个程序中的任意 VI 上使用。使用全局变 量时,数据被保存在某一固定的内存空间内,不随数据线流动,在需要读写数据的地方,直接对全局变量进行操作即可。
LabVIEW 的全局变量和局部变量是非常容易被滥用的功能,因为它们用起来很方便,可以随时随地读写数据。但是它们非常不安全,容易导致一些莫名其妙又难以调试的错误,同时它们还破坏了数据流顺序的逻辑关系,导致程序可读性和可维护性严重下降。所以我们应当尽量避免在程序中使用全局变量或局部变量。我们在局部变量一节讨论了适合使用局部变量的场景。对于全局变量,笔者建议仅仅把它用于常量定义,其它情况都应该避免使用。下面我们详细讨论一下全局变量的用法和问题。
创建全局变量
在 LabVIEW 的新建对话框中选择“全局变量”即可创建出一个空白的全局变量 VI。
或者在一个 VI 的程序框图上,选择函数选板的“编程 -> 结构 -> 全局变量”,也可以创建出一个空白的全局变量实例,双击这个全局变量实例,会打开一个空白的全局变量 VI。全局变量 VI 是一种特殊的 VI,它只有前面板,没有程序框图。在全局变量 VI 的前面板上可以放置多个控件,每个控件表示一个全局变量数据。由于一个全局变量 VI 可以存放多个全局变量数据,在编程时,可以将相关度较大的全局 数据放都在一个全局变量 VI 中,以便于管理。
不论控件是控制型的还是显示型的,它所表示的全局变量都既可读也可写。在 VI 上任何需要使用这个全局变量数据的地方,把全局变量 VI 拖到程序框图上即可生成全局变量实例,然后对其进行读写。下图中内含小地球图标的矩形方块就是一个全局变量实例,在同一版本 LabVIEW 的程序框图上,全局变量与局部变量的外观是一致的,只有图标有所区别,一个是小地球,一个是小房子。
通过这个全局变量实例,程序可以读写全局变量中的数据。如果一个全局变量 VI 上有多份全局变量数据(多个控件),在这个全局变量 VI 对应的实例上点击鼠标左键,或在右键菜单的“选择项”中,可以把这个实例与全局变量中不同的数据相关联。
通常,在不会引起误解的情况下,我们会把全局变量 VI、全局变量数据、全局变量实例,都简称为全局变量。
数据竞争状态
竞争状态是指在多个线程中,由于同时访问同一资源所引发的程序结果的不确定的状况。比如下面这个程序,假设全局变量 Data 的值原本为 0,运行完下面这个 VI,Data 中的值是几呢?