區域、全域或網路共享變數可能會發生競賽效應

更新 Oct 23, 2023

產品資訊

軟體

  • LabVIEW

問題敘述

  • 我有兩個平行執行的獨立 while 迴圈。第一個 while 迴圈擷取資料並將資料存到區域(Local)、全域(Global)或共享變數(Shared Variable)中。第二個 while 迴圈週期性從該局部、全域或共享變數中讀取資料。大多數情況下程式都正常運作,但有時會遺失資料,並且變數變成空值。
  • 我在 host computer 上有使用一個 網路共享變數(Network Shared Variable) ,而其他電腦讀取該網路共享變數時,偶爾會看到非預期的結果。

解決方案

用佇列(Queue) 實現的 Producer/Consumer 架構最常用於避免資料不足或資料溢位。使用 Producer/Consumer 架構提供了同步優勢,因為 Consumer 迴圈只在佇列中有資料時才會執行。

另一種方法是使用 Semaphores 或 Functional Global Variables,它可以在您寫入變數時有效地鎖住變數。

相關資訊

這是什麼原因?

使用兩個或多個平行迴圈寫入和讀取同一個變數或是寫入網路共享變數 (Network Shared Variable) 時同時去存取,可能會在以下情況下導致競態條件 (Race Condition):

  • 其中一個迴圈正在讀取局部、全域或共享變數的值,而另一個迴圈正在寫入局部、全域或共享變數的值。如果它們未同步,則可能在實際寫入資料之前就讀取資料完畢,反之亦然。
  • 某台電腦正在將資料寫入網路共享變數 (Network Shared Variable),同時其他電腦嘗試存取該網路共享變數 (Network Shared Variable)。