在并行循环中使用局部,全局或者共享变量时造成竞争状态



主要软件: LabVIEW Development Systems>>LabVIEW Full Development System
主要软件版本: 8.2
主要软件修正版本: N/A
次要软件: N/A

问题: 我有两个独立的并行循环,其中第一个循环获取数据并且将其保存在一个局部,全局或者共享变量上,第二个循环间隔性地从该变量中读取数据。 程序大部分时间都是正常运行的,但是有些时候却会丢失数据,而且变量变成了空值。

解答:

使用两个并行的两个循环分别去读取和写入同一个变量会造成竞争。当其中一个循环在读取该局部,全局或者是共享变量的值时,另外一个循环恰好对该变量进行写入的操作就会发生上述的问题。如果两个循环的同步没有做好的话,变量的值可能在被写入前就被读取了,反之亦然。

使用Producer/Consumer (生产者/消费者)设计模式中的队列时就可以避免数据的空缺或者溢出,该设计模式提供了同步的功能因为消费者循环只有在队列中有数据的时候才会执行。

另外一种方法是使用 Semaphores(信号量)来锁住正在写入的变量防止竞争状态。



相关链接: KnowledgeBase DIRECT-3S8RDV: What Is a Semaphore?
Developer Zone Tutorial: Application Design Patterns: Producer/Consumer
Developer Zone Tutorial: Local Variables, Global Variables, and Race Conditions

附件:





报告日期: 04/27/2001
最近更新: 05/24/2011
文档编号: 28Q6L7B5