在LabVIEW中使用队列,通知器,信号量或集合点时的潜在竞争情况



主要软件: LabVIEW Development Systems>>LabVIEW Professional Development System
主要软件版本: 2009 SP1
主要软件修正版本: 2016
次要软件: LabVIEW Development Systems>>LabVIEW Base Development System, LabVIEW Development Systems>>LabVIEW Full Development System

问题: 我有一个应用程序使用了队列,通知器,信号量或集合点,偶尔我能看到一个操作(例如元素入队列,元素出队列,等待通知,发送通知,获取信号量等)的超时时间少于指定的时间段。 最常见的是,当指定无限超时时,这可能表现为接近瞬时的超时。为什么我会看到这种行为?

解答:

National Instruments的LabVIEW研发组已经发现了可能导致这种行为的队列和通知器代码中的一个错误,并发布了2016 f2补丁来解决这个问题。这一错误可能导致在不同超时调用同一原语,其超时值来自于之前调用的超时值,而不是当前的值。 这通常在使用SubVIs封装原语时会出现,但也可能出现在单个VI中。

情况1:
此例再现了使用单个VI时的错误。下面代码在指定无限超时偶尔返回超时。

情况2:
另一种情况可以在vi.lib中提供的Acquire Semaphore VI的框图中看到:

注意,这个VI本质上只是一个入队原语的封装。因为这是共享的可重入子VI,不同的调用位置可以共享相同的实例。例如,考虑下列代码:

在这种情况下,由于从多个位置调用相同的原语,所以我们处于类似于情况1中所看到的情况。再次,代码可能会在无限大的情况下接收周期性的超时。



相关链接:

附件:





报告日期: 03/01/2017
最近更新: 05/22/2017
文档编号: 7J0E6GW9