Build-In Step Types的最后一篇,前面兩篇的連接如下:
TestStand 基礎知識[7] Build-In StepTypes(2)
TestStand 基礎知識[6] Build-In StepTypes(1)
按照慣例先貼下Build-In Step Types圖
本文主要介紹Synchronization Steps 同步步驟 ,下面所舉例子的路徑:C:\Users\Public\Documents\National Instruments\TestStand 2012\Examples\Synchronization
恰當使用同步步驟,能讓你在多線程編程中,游刃有余,一切皆有可能。
常用的幾個步驟展開介紹一下。
首先我們思考一個問題,這些同步的步驟主要作用是什么,應用於什么場景?
在TestStand中,當出現Multi-Thread或者是Multi-Execution,我們可能需要在不同線程之間通訊、等待、同步、互鎖等操作,這時同步步驟就可以登場了。
1. LocK 鎖
當出現一組步驟都需要互鎖的場景,就可以使用。
使用Lock 鎖的步驟 (1)創建Lock(2)開始Lock(3)結束Lock
在Lock和UnLock之間的步驟,同一時間只有一個線程在執行,當A線程在執行被鎖步驟時,其他線程如果也要進入執行的話,需要在 Lock "Lock 1" 步驟等待,直到A線程釋放這個鎖為止,其他線程才可以執行被鎖步驟。
當多個線程同時到達被鎖步驟時,哪個線程先執行是操作系統決定的,沒有固定順序。
另一種場景:當我們只需要互鎖一個步驟,可以是用Step Properties->Synchronization設置,如下圖
2. Semaphore 信號量
功能類似Lock, 但是在創建信號量的時候,設置初始化信號量數。如下圖
我們設置2,也就是說同一時間,允許兩個線程執行,其他線程將等待。從下面的效果圖也比較容易理解。
3. Rendezvous 集合點
集合點的工作過程是這樣的:
假設有4個線程,首先創建集合點,並且設置需要使用集合點線程的數量,也是設置為4。達到的效果是:只有4個線程都到達集合點時,所有的線程才可以繼續執行,否則將都會在集合點等待。
上圖可以看到,第三個線程沒有到集合點,所有其他三個線程都需要等待。
這個集合點的功能看似比較強大,尤其是在Batch模式下。但是在Parallel模式下,有弊端,當生產過程中,由於某個原因,需要禁用掉其中的一個或者多個線程,那么這個時候,需要手動更改集合點數量設置。否則測試會在集合點等待,無法正常測試。
4.Queue 隊列
使用隊列步驟在線程之間同步數據的生產和消費。遵守先進先出的原則。使用過LabVIEW的生產者和消費者模式的,基本都熟悉了。
可能使用的場景:在A線程中通過硬件采集數據,使用隊列傳遞給線程B,在B線程中,從隊列中接收數據和處理數據,最后反饋結果。這樣做起到一個異步的效果。避免數據應來不及實時處理,而產生丟失的情況,同時又提高了效率。
5. Notification 通知
也是不同的線程之間實現同步的一種jias方式:
如下第一張圖,線程一還沒有給線程二發送通知,所以線程二需要等待通知。
第二張圖,當線程一給線程二發送通知時,線程二就可以繼續執行。
應用場景:當主線程需要拿到子線程結果后才能繼續執行的時候,可以使用Notification。
6.Wait 等待
這個步驟,是小伙伴們使用頻率最高的同步步驟。
下面的例子,等待2S,這個應該再熟悉不過了
下面幾個選項大家估計使用頻率不高
Time Multiple : 等待內部時鍾的整數倍,功能有點類似LabVIEW中的 Wait Until Next ms Multiple 函數
Thread : 等待指定線程執行完,繼續執行下面的步驟
Execution :等待指定Execution執行完,繼續執行下面的步驟
后面兩個選項,在多線程編程中,也是比較常用的。
總結:
上面所有的例子和場景都不是唯一的,也可以根據自己的實際場景,靈活應用同步步驟。
假如編寫復雜Sequence時,比如自定義Process Model時,上面的這些同步步驟,使用頻率可能就會很高。
在平時的編程中可以嘗試使用其中的步驟,加深理解,從而靈活應用。