0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详细讲解一下不同的LabVIEW多线程同步机制

jf_V8z5L4Nx 来源:传感测控物联网 2023-08-03 10:16 次阅读

我们提到过使用局部变量、全局变量时,必须注意处理好并发访问。

举个例子:有A、B、C三个线程在并发执行。A线程修改了变量V的值,期望线程C能够读取到最新的值。B线程却在C线程读取变量V的值之前修改了V的值。这种情况我们说变量V被污染了、数据脏了。 要处理好变量的并发访问、多线程对变量的访问,我们需要使用同步机制。

在多线程软件设计中,不仅仅对变量的访问,对任何竞争性资源的使用/访问都必须使用合理的同步机制进行管理。比如,有两个线程都需要使用某个模拟输出通道,但是模拟输出通道只有1个、同一时刻只能由1个线程使用,这种情况下我们把这个模拟输出通道称作竞争性资源。

如果不对这个模拟输出通道的访问进行合理的管理,可能导致输出错误的模拟量、线程死锁、软件假死等问题。

LabVIEW可用的同步机制

在Programming->Synchronization分类下,我们可以看到LabVIEW里可用的同步机制。

0594e44c-3137-11ee-9e74-dac502259ad0.png

名称 作用 相关VI
通知器操作
Notifier Operations
挂起某个线程直到收到某个通知 Wait on Notification、Send Notification等
队列操作
QueueOperations
使用队列在线程内或线程间传递数据 Enqueue Element、DequeueElement等
信号
Semphore
通过信号量限制对竞争性资源的访问 Acquire Semphore、Release Semphore等
集合点
Rendezvous
通过集合点同步多个线程。每个到达集合点的任务将等待,直到集合点处等待的任务达到指定的数量后,所有任务才继续执行。 Wait at Rendezvous、Resize Rendezvous等
事件发生
Occurrence
通过事件发生控制和同步线程内或线程间的活动。 Generate Occurrence、Wait on Occurrence等
首次调用
First Call?
判断某段代码或某个子VI是否首次执行 /
同步数据流
Synchronize Data Flow
同步数据流,可使用多个线程的数据传送在该VI处得到同步,以确保数据传送顺序。 /

同步机制的应用

下面我们用具体的例子来详细讲解一下不同的同步机制。

1)Notifer Operations

05a8755c-3137-11ee-9e74-dac502259ad0.png

上面这个示例,Loop1和Loop2是两个并行的线程。这是实现多线程的最基本的方法。Loop1负责产生数据和停止这两个线程的运行;Loop2负责读取Loop1产生的数据,并在需要的时候及时终止线程(退出循环)。它是怎么实现的呢?Loop2等待数据通知器发出通知、等待终止通知器发出通知,收到通知后把数据读出来或者退出循环。Loop1则是把数据或者退出控件值通过发送通知传递给Loop2。

第一步:Obtain Notifer,获取通知器,如果不存在则创建。创建时按照初始值进行初始化。

第二步:Send Notification,发送通知。把数据或者控件值通过发送通知发送给等待对应通知器的线程。

第三步:Wait on Notification,等待通知。Loop2里调用Wait on Notification挂起线程,直到收到Loop1发出的通知后继续执行。

第四步:Release Notifer,释放通知器。释放资源,避免内存泄露。 这个示例里Loop1加了100ms的等待,可以确保通过Send Notification发送出去的数据可以被Loop2获取到。

如果没有这个等待100ms,Loop1发送的数据是可能丢失的,通知器不会缓冲已经发送的消息,新的消息会覆盖旧的消息。如果需要缓冲消息(连带数据),可以使用队列。

关于通知器,我们再看一个VI:Wait on Notification from Multiple,它方便我们等待多个通知,实现多对一的同步。

05d56e68-3137-11ee-9e74-dac502259ad0.png

2)Queue Operations

下面这个代码,实现的功能和上面Notifier Operations里的例子是一样的。不同的是这里用的是队列(Queue)。队列的特点是先进先出(FIFO)、缓存数据。

前面提到过,如果Loop1没有100ms等待,使用Notifer Operations是可能会丢失数据的,但是队列这里是不会的。哪怕我们去除Loop1里的100ms等待、在Loop2里加上100ms等待,让数据产生的速度大于数据被读取的速度,也是不会导致数据丢失的,来不及被读取的数据都会被存储在队列里。

05ec787e-3137-11ee-9e74-dac502259ad0.png

队列不能实现类似Wait on Notification from Multiple的功能。

3)Semaphore

Semaphore,信号量,是一个常见且重要的概念。可以简单理解为类似红绿灯(信号灯)的功能。四个方向的车都要过十字路口,十字路口又不能同时过的,它是一个竞争性资源,不同方向的车(线程)对它的使用存在竞争。实际生活中是怎么办的呢?谁获得了绿灯(信号量)谁就可以通过。 多个线程访问竞争性资源前,先尝试获取信号量,能够获得信号量的线程有权使用竞争性资源,使用完竞争性资源后释放信号量(单方向绿灯不能一直亮着啊)。

061cdbf4-3137-11ee-9e74-dac502259ad0.png

此外,对关键代码段(Critical Section)也需要使用信号量进行保护。关键代码段是指涉及变量或竞争性资源访问的代码,采用信号量进行管理,以避免多个线程同时修改变量或试图同时访问竞争性资源。

4)Rendezvous

Rendezvous,集合点,比较好理解,大家都到集合点后再出发。

例如下面这个代码:

第一步,创建集合点。集合点大小为2,表示需要等待两个任务到达集合点代码才能往下执行。

第二步、第三步,在集合点等待,Wait at Rendezvous。当Loop1和Loop2的数据流都到达集合点后,Loop1和Loop2才能够往下继续执行。

第四步,销毁集合点,释放内存。

0657b21a-3137-11ee-9e74-dac502259ad0.png

5)Occurrences

事件发生(Occurrences),用于在不同代码位置或不同线程之间同步活动。事件发生不需要轮询。 例如以下代码: 第一步,产生一个事件发生(Occurrence)。 第二步,Loop2等待第一步产生的Occurrence。这个时候Loop2线程被挂起,只有等待的事件发生(Occurrence)被Set后这个线程才会继续执行。 第三步,Loop1在完成其它可能的工作后,Set第一步中产生的事件发生(Occurrence),以使得所有在等待该Occurrence的线程可以继续运行。

06961b86-3137-11ee-9e74-dac502259ad0.png

6)First Call?、Synchronize Data Flow

First Call?检查某段代码或者某个子VI是否是第一次运行。 Synchronize Data Flow用于同步数据访问,它有四个输入端,并有四个输出端与输入端一一对应。只有四个输入端的数据都达到该VI节点了,代码才会从该节点继续往下执行。 例如下面代码,当First Call?检查到该VI是第一次运行时,先等待四个模拟信号数据(可以是实际项目中的文件读取、数据采集、系统初始化等工作)都到齐后,再往下执行代码。

06b5cea4-3137-11ee-9e74-dac502259ad0.png

所以下面这个测试代码(ONCE就是上面的VI)里,只会有一个Graph控件会有波形数据显示。另一个Graph控件的ONCE子VI被判断为非首次执行,没有波形数据产生。

06ca714c-3137-11ee-9e74-dac502259ad0.png

使用好这些同步机制可以让我们设计出可靠的应用软件。涉及代码内并发访问、多线程、竞争性资源使用的,必须采用一定的同步机制,否则软件一定会有出错的时候——可能暂时没发现,但是隐患一直在。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • LabVIEW
    +关注

    关注

    1937

    文章

    3620

    浏览量

    318583
  • 缓冲器
    +关注

    关注

    6

    文章

    1814

    浏览量

    45073
  • 模拟器
    +关注

    关注

    2

    文章

    840

    浏览量

    42838
  • Graph
    +关注

    关注

    0

    文章

    36

    浏览量

    8991
  • FIFO存储
    +关注

    关注

    0

    文章

    103

    浏览量

    5919

原文标题:LabVIEW多线程同步机制

文章出处:【微信号:传感测控物联网,微信公众号:传感测控物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LabView多线程语言

    LabView多线程语言以前只会照猫画虎的写些简单的程序,些基本原理不是很清晰。从网上找了些资料,这里总结
    发表于 06-08 10:13

    Linux内核同步机制

    在现代操作系统里,同时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程样也需要同步机制
    发表于 08-06 07:08

    多线程同步机制在应用程序与驱动程序通信中的应用

    本文对Windows NT 操作系统的多线程同步机制同步对象进行了分析,以其在检测仪和经纬仪同步通信程序开发中的应用为例,论述了如何通过共享事件来实现应用程序和设备驱动程
    发表于 08-24 10:02 16次下载

    Win32多线程同步技术浅析

    简要介绍了在Win32环境多线程访问共享资源时的同步机制,讨论了主要的4种同步对象(临界区、互斥元、事件、信号量),并描述了它们的优缺点,给出了使用Win32 API函数操控这4种对
    发表于 11-14 10:55 31次下载
    Win32<b class='flag-5'>多线程</b><b class='flag-5'>同步</b>技术浅析

    MFC多线程编程

    计算机上的上位机制作工具语言之MFC多线程编程
    发表于 09-01 14:55 0次下载

    Windows多线程编程入门讲解

    计算机上的上位机制作工具语言之Windows多线程编程入门讲解,感兴趣的可以看看。
    发表于 09-01 15:27 0次下载

    你了解Linux内核的同步机制

    在现代操作系统里,同时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程样也需要同步机制
    发表于 05-12 08:26 569次阅读

    linux多线程机制-线程同步

    运行的线 程,并且要使用同个缓冲区进行数据交换,因此必须利用机制进行同步。通过上面的例子我们可以看到,多线程的最大好处是,除堆栈之外,
    发表于 04-02 14:42 374次阅读

    Linux多线程编程

    接口,称为pthread。编写Linux多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linuxpthread的实现是通过系
    发表于 04-02 14:43 507次阅读

    Linux内核的同步机制

    在现代操作系统里,同时间可能有多个内核执行流在执行,因此内核其实像多进程多线程编程样也需要同步机制
    的头像 发表于 09-22 09:46 2100次阅读
    Linux内核的<b class='flag-5'>同步机制</b>

    Linux中多线程编程的知识点

    Hello、Hello大家好,我是木荣,今天我们继续来聊聊Linux中多线程编程中的重要知识点,详细谈谈多线程同步和互斥
    发表于 04-26 17:27 513次阅读
    Linux中<b class='flag-5'>多线程</b>编程的知识点

    labview AMC多线程

    labview_AMC多线程
    发表于 08-21 10:31 23次下载

    如何使用pthread_barrier_xxx系列函数来实现多线程之间的同步

    在Linux系统中提供了多种同步机制,本文主要讲讲如何使用pthread_barrier_xxx系列函数来实现多线程之间进行同步的方法。
    的头像 发表于 10-23 14:43 538次阅读
    如何使用pthread_barrier_xxx系列函数来实现<b class='flag-5'>多线程</b>之间的<b class='flag-5'>同步</b>?

    多线程同步的几种方法

    多线程同步是指在多个线程并发执行的情况,为了保证线程执行的正确性和致性,需要采用特定的方法来
    的头像 发表于 11-17 14:16 719次阅读

    多线程如何保证数据的同步

    。本文将详细介绍多线程数据同步的概念、问题、以及常见的解决方案。 多线程数据同步概念 在
    的头像 发表于 11-17 14:22 538次阅读