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順序性。

  1. 使用Synchronization的程序管控

可以使用Queue、Notifier、Semaphore,這些程序上的管控,確保資料流的運行。

在這些Synchronization元件裡面,變化最多且最彈性的示Queue,關於Queue的使用方法介紹,可以參考:

LabVIEW_Queue的用法和範例

或是參考其他的Sychronization元件:

LabVIEW_Synchornization-Semaphone(紅綠燈)教學範例

LabVIEW_Notifier傳遞資料、程序管控教學範例

LabVIEW_Occurrence使用方法和教學範例

 

其他參考資料:

Race Conditions and Functional Global Variables in LabVIEW

A Look at Race Conditions

 

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

arrow
arrow

    安伯伯 發表在 痞客邦 留言(0) 人氣()