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

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

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


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


解答:


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


情况1:


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


b1ccdb7def0905b038968733eb1da65e.png

编辑


添加图片注释,不超过 140 字(可选)


情况2:


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


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

5732cd74cba1e2437db4d64c372382c0.png

编辑


添加图片注释,不超过 140 字(可选)



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


LabVIEW、LabVIEW开发、LabVIEW编程、LabVIEW程序


上文中提到的例子和资料,均在word中的附件里,可点击下载。进一步了解,可联系们。

相关文章
|
7月前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
53 1
|
8月前
|
Java 调度
并发编程之的虚假唤醒和精准唤醒的详细解析
并发编程之的虚假唤醒和精准唤醒的详细解析
75 0
|
8月前
|
Java 调度
多线程与并发编程【线程休眠、线程让步、线程联合、判断线程是否存活】(二)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程休眠、线程让步、线程联合、判断线程是否存活】(二)-全面详解(学习总结---从入门到深化)
79 1
|
供应链 算法 Linux
Linux系统编程6(线程互斥,锁,同步,生产消费模型)
Linux系统编程6(线程互斥,锁,同步,生产消费模型)
317 2
|
Java
线程等待唤醒(等待通知)机制
线程等待唤醒(等待通知)机制
49 0
|
消息中间件 Cloud Native Java
线程同步模式之保护性暂停
保护性暂停是一种同步模式,用于保护共享资源的完整性。在多线程或多进程环境中,如果多个线程或进程同时访问共享资源,可能会导致数据不一致或者竞态条件等问题
178 0
|
Linux
Linux驱动开发——并发和竞态(信号量方式的使用④)
Linux驱动开发——并发和竞态(信号量方式的使用④)
177 0
Linux驱动开发——并发和竞态(信号量方式的使用④)
|
消息中间件
进程同步的方式有哪些
进程同步的方式有哪些
297 0

热门文章

最新文章

相关实验场景

更多
下一篇
开通oss服务