• TestStand 基础知识[8] Build-In StepTypes(3)


    Build-In Step Types的最后一篇,前面两篇的连接如下:

    TestStand 基础知识[7] Build-In StepTypes(2) 

    TestStand 基础知识[6] Build-In StepTypes(1) 

    按照惯例先贴下Build-In Step Types图

    本文主要介绍Synchronization Steps 同步步骤  ,下面所举例子的路径:C:UsersPublicDocumentsNational InstrumentsTestStand 2012ExamplesSynchronization

    恰当使用同步步骤,能让你在多线程编程中,游刃有余,一切皆有可能。

    常用的几个步骤展开介绍一下。

    首先我们思考一个问题,这些同步的步骤主要作用是什么,应用于什么场景?

    在TestStand中,当出现Multi-Thread或者是Multi-Execution,我们可能需要在不同线程之间通讯、等待、同步、互锁等操作,这时同步步骤就可以登场了。

    1. LocK  锁

     当出现一组步骤都需要互锁的场景,就可以使用。

     使用Lock 锁的步骤 (1)创建Lock(2)开始Lock(3)结束Lock

     在Lock和UnLock之间的步骤,同一时间只有一个线程在执行,当A线程在执行被锁步骤时,其他线程如果也要进入执行的话,需要在 Lock "Lock 1" 步骤等待,直到A线程释放这个锁为止,其他线程才可以执行被锁步骤。

    当多个线程同时到达被锁步骤时,哪个线程先执行是操作系统决定的,没有固定顺序。

    另一种场景:当我们只需要互锁一个步骤,可以是用Step Properties->Synchronization设置,如下图

    2. Semaphore 信号量

    功能类似Lock, 但是在创建信号量的时候,设置初始化信号量数。如下图

    我们设置2,也就是说同一时间,允许两个线程执行,其他线程将等待。从下面的效果图也比较容易理解。

    3. Rendezvous 集合点

    集合点的工作过程是这样的:

    假设有4个线程,首先创建集合点,并且设置需要使用集合点线程的数量,也是设置为4。达到的效果是:只有4个线程都到达集合点时,所有的线程才可以继续执行,否则将都会在集合点等待。

     

    上图可以看到,第三个线程没有到集合点,所有其他三个线程都需要等待。

    这个集合点的功能看似比较强大,尤其是在Batch模式下。但是在Parallel模式下,有弊端,当生产过程中,由于某个原因,需要禁用掉其中的一个或者多个线程,那么这个时候,需要手动更改集合点数量设置。否则测试会在集合点等待,无法正常测试。

    4.Queue 队列

    使用队列步骤在线程之间同步数据的生产和消费。遵守先进先出的原则。使用过LabVIEW的生产者和消费者模式的,基本都熟悉了。

    可能使用的场景:在A线程中通过硬件采集数据,使用队列传递给线程B,在B线程中,从队列中接收数据和处理数据,最后反馈结果。这样做起到一个异步的效果。避免数据应来不及实时处理,而产生丢失的情况,同时又提高了效率。

    5. Notification 通知

    也是不同的线程之间实现同步的一种jias方式:

    如下第一张图,线程一还没有给线程二发送通知,所以线程二需要等待通知。

    第二张图,当线程一给线程二发送通知时,线程二就可以继续执行。

    应用场景:当主线程需要拿到子线程结果后才能继续执行的时候,可以使用Notification。

    6.Wait 等待

     这个步骤,是小伙伴们使用频率最高的同步步骤。

    下面的例子,等待2S,这个应该再熟悉不过了

    下面几个选项大家估计使用频率不高

    Time Multiple : 等待内部时钟的整数倍,功能有点类似LabVIEW中的 Wait Until Next ms Multiple 函数

    Thread  : 等待指定线程执行完,继续执行下面的步骤

    Execution :等待指定Execution执行完,继续执行下面的步骤

    后面两个选项,在多线程编程中,也是比较常用的。

    总结:

     上面所有的例子和场景都不是唯一的,也可以根据自己的实际场景,灵活应用同步步骤。

     假如编写复杂Sequence时,比如自定义Process Model时,上面的这些同步步骤,使用频率可能就会很高。

     在平时的编程中可以尝试使用其中的步骤,加深理解,从而灵活应用。

  • 相关阅读:
    读书笔记 effective c++ Item 32 确保public继承建立“is-a”模型
    读书笔记 effective c++ Item 31 把文件之间的编译依赖降到最低
    读书笔记 effective c++ Item 30 理解内联的里里外外 (大师入场啦)
    程序猿开发语言投票
    读书笔记 effective c++ Item 29 为异常安全的代码而努力
    读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
    C++ 11和C++98相比有哪些新特性
    读书笔记 effective c++ Item 27 尽量少使用转型(casting)
    如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
    如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
  • 原文地址:https://www.cnblogs.com/YourDirection/p/12327179.html
Copyright © 2020-2023  润新知