Race Condition(競爭危害) 在LabVIEW初學中是一個很容易犯的錯誤,Race Condition發生時的表現通常會是: 1.程式隨機出現一些不一樣的結果 2.程式失控 (停不下來、程式程序亂跳) 。所以當你的程式出現上面敘述的徵兆,或是常常出現不可預期的結果,就需要注意是否有Race Condition的情況。
如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~
Race Condition的定義從WIKI上擷取了一段文字: 同時試圖修改一個共享記憶體的內容,在沒有並行控制的情況下,最後的結果依賴於兩個行程的執行順序與時機。而且如果發生了並行存取衝突,則最後的結果是不正確的。 在LabVIEW中,最常也最容易發生的原因通常是因為變數的濫用,由於區域變數或全域變數的使用打破了資料流的概念,造成執行的時間與順序不容易預期。
上面的文字可能咬文嚼字的比較難理解,下面一個範例,一個程式中有兩段程式A、B,分別做Numeric變數+1的動作。
假設初始Numeric=0,在A程序的時候 Numeric+1=Numeric ,0+1=1,Numeric結果為1;在B程序的時候 Numeric+1=Numeric ,這時候延續程序A的結果1+1=2,Numeric結果為2;也就是跑完最後結果時Numeric=2 。如下圖所畫的,B程序是A程序運算後的結果再做運算的。
但是在LabVIEW中,A、B這兩個程序其實並沒有順序性,也就是B不一定要等到A做完才能開始,也就會有另外一種狀況: Numeric 在A、B程序中,初使值都是0,經過+1程序後變成1,也就是跑完最後結果時Numeric=1。
從上面兩個情況可以發現,同一個程式所產生的結果會有不同的結果,Numeric=1或是Numeric=2,這就是典型的Race Condition的結果,而A、B程序誰先做、或同時做,這個是電腦程序所支配的,這無法使用LabVIEW上的設定做修改。
如果要避免Race Condition這種情況,需要做程式上的修改,這邊列出幾個建議:
1.讓程式有資料流,例如加入Sequence讓程序照著自己的想法運行。
2. 用Funtional Global Variable 代替 Global Varaible、Local Variable 這種跳脫資料流的元件。
Funtional Global Variable 強調的是一次進入VI的程序只會有一個,這個和VI運行的程序有關,可以參考LabVIEW_Reentrant Execution 可重入執行屬性設定這篇提到,VI在初始設定中,如果同時運行同個VI,會先做完某一個接下來做下一個;當然這樣使用FGV並不能確保先做A還是B,所以還是要將FGV的Error連接好給FGV順序性。
- 使用Synchronization的程序管控
可以使用Queue、Notifier、Semaphore,這些程序上的管控,確保資料流的運行。
在這些Synchronization元件裡面,變化最多且最彈性的示Queue,關於Queue的使用方法介紹,可以參考:
或是參考其他的Sychronization元件:
LabVIEW_Synchornization-Semaphone(紅綠燈)教學範例
其他參考資料:
Race Conditions and Functional Global Variables in LabVIEW
如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~
學習相關LabVIEW文章:
程式分享相關LabVIEW文章:
考取LabVIEW證照相關:
留言列表