下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 5.如何使用 VI 的重入属性(Reentrant)

5.如何使用 VI 的重入属性(Reentrant).doc

5.如何使用 VI 的重入属性(Reentrant)

幸运bettygao
2018-09-10 0人阅读 举报 0 0 暂无简介

简介:本文档为《5.如何使用 VI 的重入属性(Reentrant)doc》,可适用于IT/计算机领域

  在VIProperties>Execution中可以选择VI的ReentrantExecution属性(中文译为:可重入执行)。我们在《LabVIEW程序的内存优化》一文中讨论过尽量不要把VI设置为重入属性因为这样就多占用了内存降低了运行效率。此外如果不加注意的话还可能引发多线程不安全的问题。尽管可重入VI在LabVIEW中不是必须的但是在某些情况下使用可重入VI可以简化我们的程序。那么在什么情况下可以使用ReentrantVI呢  首先看一下图所示的程序程序中调用的两个子VI是同一个VI并且不是可重入的VI。LabVIEW是自动多线程的语言那么图中的两个子VI会不会同时执行呢。一定不会的。如果程序中调用的是两个不同的子VILabVIEW有可能会同时在不同的线程执行它们但对于两次调用相同的子VILabVIEW一定要等一个执行完再执行另一个。    图:并行的两个相同子VI  其原因是LabVIEW会为每个VI都开辟一块内存用于数据存储。作为子VI每次被调用它的局部变量的数据都是被存在同一地址的。与C语言相对照在默认情况下VI是不可重入的VI中所有的局部变量都是静态变量。如果LabVIEW在不同的线程下执行同一VI那么两个线程就会同时对这一块数据地址进行读写就会导致这一块地址内数据的混乱。为避免此类不安全情况的出现LabVIEW必须等待一个子VI执行结束再执行另一个子VI。  如果需要图中的两个子VI同时运行比如子VI所做的工作是读取文件这样一类耗时多、但CPU占用不大的操作则并行执行可以大大提高效率。这时就需要把子VI设置为可重入了。LabVIEW在不同的地方调用一个可重入VI时会给它另外分配一个独立的数据地址空间。这样就做到了线程安全。在两个线程执行的子VI使用两份在不同的地址存储的数据也就不会造成混乱。但是千万要注意这个“在不同的地方”调用:不可重入的VI的局部变量与C语言中非静态变量的含义是不同的。在后面提到的计数器的例子可以验证这一点。  我觉得我说得挺清楚了出道题目给大家测试一下:    图:延时子VI    图:计算延时的主VI  图是一个子VI的代码功能是延时毫秒。图是主VI的代码并行调用同一子VI两次并计算程序的执行时间。运行主VItotaltime的值是多少  答案在文章最后。  这是可重入VI的一种用途即希望在不同的线程里同时执行同一个子VI。  另外还有一种情况下也可以用到可重入VI:即需要使用到子VI中局部变量保存的数据而在不同的调用处这些数据是独立不同的。这句话可能解释得不那么清楚看下面例子就会比较容易理解些。    图:计数子VI    图:测试计数的主VI  图是一个可重入子VI的代码功能是计算这个VI被运行的次数每运行一次输出的count值就增加。图是调用它的主VI用于演示这个计数器。执行主VI一次output和output的值分别是和表示这个子VI在两处分别被调用了次和次。  如果把图中的VI改为不可重入则output和output的输出值是不确定的。大家可以自己试一试再想一下原因。  当使用递归结构时参与了递归调用的VI是需要被同时调用多次的。因此这些VI中的变量必须是局部的也就是说参与了递归调用的VI必须都被设置为可重入。参考:在LabVIEW中实现VI的递归调用  测试题目答案:如果图的子VI没有设置为可重入则totaltime=如果设置为可重入则totaltime=。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/4

5.如何使用 VI 的重入属性(Reentrant)

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利