首页 > 其他分享 >关于面向对象的方法并行执行的问题

关于面向对象的方法并行执行的问题

时间:2024-07-13 10:51:59浏览次数:18  
标签:重入 调用 调用者 VI 并行执行 面向对象 实例 关于 副本

LabVIEW的从同一个类实例化的多个对象如何执行各自的方法呢?

这几天跟同事讨论到LabVIEW的面向对象编程中,如果我设计的一个类有一个方法比较耗时,那么当我实例化多个对象时,那么这个耗时的方法是怎么执行的呢?是各自并行执行还是,必须等某一个对象的方法调用完,接下来调用第二个对象的该方法呢?

接下来,我们直接来做个试验吧!

试验设计:

我们设计一个类——Person

该类包含的一个描述其状态的私有数据——State;

有对该数据的读写的接口;

有一个耗时的方法——WalkAWay

好了,类的程序设计完了,我们做一个Main.vi来进行测试:

我们看下执行的结果:

该Main程序共计耗时为2个对象的Walk方法执行时间之和:2000+1500=3500ms;

由此,我们可以看到,默认设计的类,其方法在各个对象间是串行执行的;

接下来,重点:

我们回去修改下我们设计的类的WalkAWay方法。

然后再执行Main测试vi,执行结果:

我们可以看到,这次就是并行执行了WalkAWay方法了。

至此,我们可以得出结论:

默认设计的类的方法是串行,执行,如果又耗时的程序,我们可以通过调整方法的共享副本可重入属性来实现不同对象间调用方法并行执行。这个能大大节约程序执行时间,尤其使我们在多slot并行测试的软件设计时尤为重要。

说明:上述如果将方法vi的设置为第三个——预分配副本的话,类的设计会直接报错,也就是说LabVIEW不让我们这么设置。

附件:vi的可重入属性的说明:

Non-reentrant execution
不可重入: 多个调用者调用此VI时,是按照顺序逐一调用的。优势是最小的内存消耗,同时也会使得所有调用该VI的共享一个状态,在调用中保留控件和未被初始化移位寄存器的值。

Shared clone reentrant execution
可重入:在实例间共享副本(减少内存使用),允许多个调用者同步并行执行该VI,这个类型的可重入,为了减少内存消耗,在调用中复用克隆副本。

当调用者B调用该VI时,如果克隆实例正在被调用者A使用中,那么LabVIEW 会分配一个新的克隆实例给调用者B。

当调用者B调用该VI时,如果克隆实例没有被使用,那么LabVIEW不会再开辟新的克隆实例。因此每个调用者维护自己的状态,保留控件和未赋值移位寄存器的值

Preallocated clone reentrant execution
可重入:为各个实例预分配副本,允许多个调用者同步并行执行该VI,这个类型的可重入,为每一个实例预分配独立克隆实例,并以开辟更多的克隆实例为代价。

那么VI何时使用可重入,并且到底选共享副本还是各个实例预分配副本?

场景和原则

  1. 当VI中有使用全局变量、或者功能全局变量时,不能设置成---->可重入:在实例间共享副本(减少内存使用)

  2. 如读取文件一类时,可以考虑设置可重入,使得调用者可以并行执行,提高效率。

  3. 当需要实现一些,共享克隆实例时,可以考虑使用--->可重入:在实例间共享副本(减少内存使用) 例如 递归操作。

  4. 如果VI克隆实例暂用资源很小,但是运行时间较长,可以考虑使用---->可重入:为各个实例预分配副本

  5. VI可重入设置,是为多线程调用准备的,如果在该VI被调用过程中,不会出现多线程调用该VI,那么没有必要设置可重入,保持默认即可。
    引用自:https://www.cnblogs.com/YourDirection/p/12833877.html

标签:重入,调用,调用者,VI,并行执行,面向对象,实例,关于,副本
From: https://www.cnblogs.com/StephenYoung/p/18299777

相关文章

  • 关于最近看到的一些前沿技术
    看了一下新技术,感觉自己所了解的技术真的太窄了。什么新技术呢? WebAssembly官网https://webassembly.org https://developer.mozilla.org/zh-CN/docs/WebAssemblyWebAssembly是一种新的编码方式,可以在现代的Web浏览器中运行——它是一种低级的类汇编语言,具有紧凑的......
  • 【python学习】面向对象编程以及面向对象编程的核心概念和使用方法
    引言Python语言设计之初,就是为了面向对象,所以Python的面向对象更加易于理解。面向对象编程中,我们将现实世界的实体视为对象,每个对象都有属性(数据)和行为(方法)文章目录引言一、面向对象编程是什么二、面向过程编程和面向对象编程的区别2.1面对过程编程2.2面向对象编......
  • 一道关于逆向的实战CTF题目分析
    前言本题自带call型花指令,考验选手对花指令的理解程度。加密属于基础的异或和左右移位加密。主要考察选手的基础能力,动态调试和写脚本的能力。在这篇文章,详细记录了我的分析过程,相信你会有很大收获。1、查壳​PE64位,没壳程序2、IDA分析去花指令使用IDA打开时,发现一片红,很正......
  • 关于cartographer在github中的文件分配
    Cartographer是一个开源的库,用于2D和3D的SLAM。在Cartographer项目中,地图构建的数据传入和处理通常分布在几个不同的组件和文件夹中。以下是一些可能包含相关代码的文件夹和组件:1.**传感器驱动**(`cartographer/sensor`):这个目录包含用于处理不同类型传感器输入的代码,例如......
  • 关于SVD-LLM的应用-基于SVD量化
    关于SVD-LLM的应用-基于SVD量化一背景论文连接:https://arxiv.org/pdf/2403.07378这是论文github:https://github.com/AIoT-MLSys-Lab/SVD-LLM 二什么是SVD SVD可能是可以把矩阵向量转化到另外一个空间角度,以方便数据处理。2.1概念SVD(Singular......
  • 关于Java内存区域的理解和记录
    近期做项目遇到了FullGC的问题,干脆总结一下Java内存区域分布和垃圾回收是咋回事。Java内存区域按照线程隔离状态直接分成三大块空间:线程私有:程序计数器是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。在虚拟机概念模型里,字节码解释器工作时就是通过改变这......
  • 关于CAD的有关计算机知识的探讨
    近几年,CAD绘图技术得到了快速的发展,并且CAD绘图技术在各种设计领域中得到了广泛的应用。比如:在建筑设计、工业产品的设计、机械设计以及模具设计中都广泛使用了CAD绘图技术。二维制图领域CAD起着一个基础性的制图地位,并且它也标志着二维向三维转换的重要的步骤。以下是学习......
  • 关于电气CAD对于初学者的介绍和相关资料
    电气图的特点3.1电气图的作用阐述电的工作原理,描述产品的构成和功能,提供装接和使用信息的重要工具和手段。3.2简化图简图是电气图的主要表达方式,是用图形符号、带注释的围框或简化外形表示系统或设备中各组成部分之间相互关系及其连接关系的一种图。3.3元件及连接线元件......
  • 关于线程池的两种创建方式
    1.第一种方式Executors工具类固定大小线程池:newFixedThreadPool单一线程池:newSingleThreadExecutor可变线程池:newCachedThreadPool调度线程池:newScheduledThreadPool1.1单一线程池该线程池只有一个线程,适用于需要按任务执行线程场景,保证任务的顺序性//创建应该单一线......
  • 【少儿编程Python:趣味编程,探索未来】第四章 面向对象编程,开启编程新境界 / 第一节 类
    欢迎进入Python编程的奇幻世界!在这个课程中,我们将一起探索编程的乐趣,通过生动有趣的方式,培养孩子们的逻辑思维和创造力,让他们成为未来的科技小达人。以下是我们课程的大纲:【少儿编程Python:趣味编程,探索未来】目录1.面向对象1.1面向对象的定义1.2面向对象的......