在 VI Properties -> Execution 中可以选择 VI 的Reentrant Execution属性(中文译为:可重入执行)。 我们在《LabVIEW 程序的内存优化》一文中讨论过,尽量不要把 VI 设置为重入属性,因为这样就多占用了内存,降低了运行效率。此外,如果不加注意的话,还可能引发多线程不安全的问题。 尽管可重入 VI 在 LabVIEW 中不是必须的,但是在某些情况下使用可重入 VI 可以简化我们的程序。那么在什么情况下可以使用 Reentrant VI 呢?

: q' n& |: [0 n& C; m, M

首先看一下图 1 所示的程序,程序中调用的两个子 VI 是同一个 VI,并且不是可重入的 VI。LabVIEW 是自动多线程的语言,那么图中的两个子VI会不会同时执行呢。一定不会的。如果程序中调用的是两个不同的子 VI,LabVIEW 有可能会同时在不同的线程执行它们,但对于两次调用相同的子 VI,LabVIEW 一定要等一个执行完,再执行另一个。

1 b) }1 |# G5 u( J# t! _

Image00000.jpg (21.39 KB, 下载次数: 0)

2008-8-31 10:37 上传

 图1:并行的两个相同子 VI

( }1 v# v, ~1 p  ]' i. l5 q6 _

其原因是,LabVIEW 会为每个 VI 都开辟一块内存用于数据存储。作为子 VI,每次被调用,它的局部变量的数据都是被存在同一地址的。与 C 语言相对照,在默认情况下,VI 是不可重入的,VI 中所有的局部变量都是静态变量。如果 LabVIEW 在不同的线程下执行同一 VI,那么两个线程就会同时对这一块数据地址进行读写,就会导致这一块地址内数据的混乱。为避免此类不安全情况的出现,LabVIEW 必须等待一个子 VI 执行结束,再执行另一个子 VI。
    如果需要图1 中的两个子 VI 同时运行,比如子 VI 所做的工作是读取文件这样一类耗时多、但CPU占用不大的操作,则并行执行可以大大提高效率。这时,就需要把子 VI 设置为可重入了。LabVIEW 在不同的地方调用一个可重入 VI 时,会给它另外分配一个独立的数据地址空间。这样就做到了线程安全。在两个线程执行的子 VI 使用两份在不同的地址存储的数据,也就不会造成混乱。但是千万要注意, 这个“在不同的地方”调用:不可重入的 VI 的局部变量与 C 语言中非静态变量的含义是不同的。在后面提到的计数器的例子可以验证这一点。

& r& I  v5 E. V5 g: h0 n

我觉得我说得挺清楚了,出道题目给大家测试一下:

4 E7 w' W: W: A, g

Image00001.jpg (10.95 KB, 下载次数: 0)

2008-8-31 10:37 上传

图2:延时子 VI # q3 X3 @' z3 b* ?. r2 q$ n

Image00002.jpg (15.25 KB, 下载次数: 0)

2008-8-31 10:37 上传

图3:计算延时的主 VI 0 I/ t2 M) c" y+ I7 b! C

图2 是一个子 VI 的代码,功能是延时 1000 毫秒。图3 是主 VI 的代码,并行调用同一子 VI 两次,并计算程序的执行时间。运行主 VI,total time 的值是多少?
    答案在文章最后。

' Q% s8 p. }, }( {

这是可重入 VI 的一种用途,即希望在不同的线程里同时执行同一个子 VI。
    另外还有一种情况下,也可以用到可重入 VI:即需要使用到子 VI 中局部变量保存的数据,而在不同的调用处,这些数据是独立不同的。这句话可能解释得不那么清楚,看下面例子就会比较容易理解些。 " j# _0 {2 d: w0 B8 q

Image00003.jpg (17.7 KB, 下载次数: 0)

2008-8-31 10:37 上传

图4:计数子 VI

& l  ~3 P* R  s5 k! l1 e

Image00004.jpg (13.62 KB, 下载次数: 0)

2008-8-31 10:37 上传

图5:测试计数的主 VI $ L& A/ i8 O5 S: K

图 4 是一个可重入子 VI 的代码,功能是计算这个VI被运行的次数,每运行一次,输出的 count 值就增加1。图5 是调用它的主VI,用于演示这个计数器。执行主VI一次,output 1 和 output 2 的值分别是 10 和 20,表示这个子 VI 在两处分别被调用了 10 次和 20 次。
    如果把图 4 中的 VI 改为不可重入,则 output 1 和 output 2 的输出值是不确定的。大家可以自己试一试,再想一下原因。

* H& _: ~/ \% P; z/ {$ N# W

当使用递归结构时,参与了递归调用的 VI 是需要被同时调用多次的。因此这些 VI 中的变量必须是局部的,也就是说参与了递归调用的 VI 必须都被设置为可重入。参考:在 LabVIEW 中实现 VI 的递归调用 % N9 u  w/ J9 H$ y

' P9 x8 S/ a, `

测试题目答案:如果图2的子 VI 没有设置为可重入,则 total time = 2000;如果设置为可重入则 total time = 1000。

labview c语言定义变量,第一章:LabVIEW 的编程环境 如何使用 VI 的重入属性(Reentrant)...相关推荐

  1. 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案

    <<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...

  2. c语言第一章,C语言修正版第一章

    <C语言修正版第一章>由会员分享,可在线阅读,更多相关<C语言修正版第一章(28页珍藏版)>请在人人文库网上搜索. 1.C,语言,重要性,结构化编程语言,语言的入门课,基础课, ...

  3. 《Go语言圣经》第一章 - 读书笔记

    <Go语言圣经>第一章 - 读书笔记 第一章 Go语言入门 01 Hello World 02 命令行参数 练习 练习1.1 练习1.2: 练习1.3: 03 查找重复的行 例子运行 du ...

  4. 数据结构(C语言)第二版 第一章课后答案

    数据结构(C语言)第二版 第一章课后答案 这本书,我以后也会用,所以趁着考完试做个整理,顺便分享出来.电子资源发不出来,放评论区吧,有需要自取. 1. 简述下列概念:数据.数据元素.数据项.数据对象. ...

  5. 16第一章 ASP.Net编程基础知识

    第一章        ASP.Net编程基础知识 第一章        ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...

  6. 软件测试之第一章 软件测试和测试环境

    第一章 软件测试和测试环境 一. 软件的含义和分类 1 软件的含义 软件是程序.数据和文档的集合. 程序:编程语言:C.C++.Java.php 等. 数据:使用文件或数据库来存储数据. 文档:安装说 ...

  7. java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)

    对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一个程序 ...

  8. c il语言 定义变量,[转载]Skill语言入门

    第一章SKILL 语言基础 1.1 SKILL 语言简介 SKILL 是用于Cadence 软件二次开发的语言.我们关于SKILL 的介绍基于SKILL 语言参考档和Allegro SKILL的应用. ...

  9. 《Abaqus GUI程序开发指南(Python语言)》——第一章 概述1.1 简单插件实例——创建带孔板有限元模型...

    本节书摘来自异步社区<Abaqus GUI程序开发指南(Python语言)>一书中的第1章,第1.1节,作者: 贾利勇 , 富琛阳子 , 贺高 , 周正光 更多章节内容可以访问云栖社区&q ...

最新文章

  1. SQLI DUMB SERIES-5
  2. Response.Redirect 打开新窗口的两种方法
  3. 吴恩达深度学习课程deeplearning.ai课程作业:Class 1 Week 4 assignment4_1
  4. [坑] IDEA Unable to import maven project 解决办法
  5. Android版:验证手机号码的正则表达式 (转)
  6. vue项目统一响应_Vue响应式原理及总结
  7. MyBatis学习存档(4)——进行CRUD操作
  8. sap未分摊差异怎么处理_MM采购中形成的差异
  9. 拓端tecdat|探析大数据期刊文章研究热点
  10. 实战篇:如何用Keras建立神经网络(附全部代码) 1
  11. 软件工程在线画图工具
  12. 安装python时系统找不到指定的路径_系统找不到指定的路径【操作步骤】
  13. 网吧服务器磁盘性能,网吧游戏服务端显示磁盘已满怎么解决
  14. slice(),splice(),split(),substring(),substr()使用方法和区别
  15. lisp如何批量选中特定图层_CAD里怎样一键选中某一个图层的所有内容?
  16. java获取中文字符串汉语拼音和首字母
  17. MATLA 如何让保存的文件名随着参数的改变而改变
  18. [dpdk] SDK编译配置
  19. 【Kernel】驱动开发学习之Platform平台总线模型
  20. 基于点线特征的激光雷达+单目视觉里程计

热门文章

  1. 用matlab 实现向量范数和矩阵范数
  2. dubbo学习(六)超时和重试次数配置
  3. openwrt udp服务器_DNS污染检测,DNS污染检测的操作方法|服务器|主机|dns|报文|数据包...
  4. 开关sw在matlab中,在使用MATLAB“绘图”选项卡中的命令按钮绘图之前,需要( )。...
  5. Intel8086处理器使用NASM汇编语言实现操作系统09-关于数组复制的实现/movsb/movsw/cld/std/rep
  6. Udesk即时通讯(IM)网页插件入门
  7. SQLserver数字转换为大写汉字
  8. 离散傅里叶变换及matlab实现(按时间抽选(DIT)的基-2 FFT算法(库利-图基算法))
  9. 机器学习 社交网络_机器学习从业人员在社交媒体上的自我推广会是什么样子?...
  10. Postman异步请求