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

news/2024/9/20 17:32:41/文章来源:https://www.cnblogs.com/StephenYoung/p/18299777

这几天跟同事讨论到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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/742996.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARMv8中non-shareable inner-shareable outer-shareable属性

如果将block的内存属性配置成Non-cacheable,那么数据就不会被缓存到cache,那么所有observer看到的内存是一致的,也就说此时也相当于Outer Shareable。 其实官方文档,也有这一句的描述: 在B2.7.2章节 “Data accesses to memory locations are coherent for all observers …

「代码随想录算法训练营」第十天 | 栈与队列 part2

150. 逆波兰表达式求值题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/ 题目难度:中等 文章讲解:https://programmercarl.com/0150.逆波兰表达式求值.html 视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on 题目状态:多次修改 bug 后通过…

【触想智能】安卓工控一体机在自助终端设备上的应用分析

随着科技的发展和人们对自动化系统的需求不断增强,自助终端设备已经成为日常生活非常常见的设备之一,例如自助售货机、自助点餐机、自助银行服务等。这些设备在使用中都需要一个可靠的、稳定的操作系统来支持其各项功能的实现。因此,安卓工控一体机在自助终端设备上的应用越…

[HarekazeCTF2019]encode_and_encode 1

json绕过,waf绕过 打开之后可以直接看到源码<?php error_reporting(0);if (isset($_GET[source])) {show_source(__FILE__);exit(); }function is_valid($str) {$banword = [// no path traversal\.\.,// no stream wrapper(php|file|glob|data|tp|zip|zlib|phar):,// no …

Windows 11 中使用 Win10的文件资源管理器!速度立马起飞

Windows 11的文件资源管理器功能丰富,但性能略逊于Windows 10版本。新版本增加了选项卡、现代UI和预览窗格等功能,但也导致运行速度变慢。因此,一些用户更偏好旧版本的简洁和快速,甚至怀念经典的Ribbon界面。 好消息是,有一种方法可以永久恢复Windows 10的文件资源管理器。只需…

[NPUCTF2020]ezinclude 1

md5, 题目打开之后是什么都没有的,直接进行抓包可以看到是给了一个hash值的,而且告诉了 Set-Cookie中的Hash就是$md5($secret.$name)(经典脑洞) 如果$name=,则有$md5($secret.$name)=$md5($secret)=上面的Hash 则/?pass=上面的Hash即可,或者带上&name=传递空值访问f…

Python序列

Python序列 在Python中,序列类型包括字符串、列表、元组、集合和字典,这些序列支持以下几种通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作。字符串也是一种常见的序列,它也可以直接通过索引访问字符串内的字符。序列索引 序列中,每个元素都有属…

电影《抓娃娃》迅雷BT完整下载[MP4/2.12GB/5.38GB]高清版画质百度云资源[1080p]

在2024年的暑期档,一部由沈腾和马丽主演的爆笑喜剧电影《抓娃娃》横空出世,迅速吸引了广大观众的眼球。这部由闫非、彭大魔执导,彭大魔、闫非、林炳宝共同编剧的作品,不仅延续了开心麻花一贯的幽默风格,更在笑声中融入了深刻的家庭与教育议题,成为了一部既娱乐又具有深度…

vs2022导入optional库optional还报错,解决

修改c++标准为C++17以上项目属性->c/c++->语言 修改c++标准超过c++17VS默认用的标准太低了....这个是C++17引入的参考:https://stackoverflow.com/questions/62370027/namespace-std-does-not-contain-optional