軟件開發(fā)過程中總會遇到需要多線程同步運(yùn)行的情況,尤其是一些復(fù)雜的測試系統(tǒng)和大型項(xiàng)目,僅靠單線程運(yùn)行的程序是遠(yuǎn)遠(yuǎn)無法滿足用戶需求的,甚至可以說在復(fù)雜測試系統(tǒng)的軟件開發(fā)中,多線程運(yùn)行是最基本的。
所以不論使用什么開發(fā)環(huán)境都需要工程師們掌握如何進(jìn)行多線程編程。在多線程開發(fā)這一點(diǎn)上LabVIEW有其獨(dú)到的優(yōu)勢,那就是LabVIEW是自動并行運(yùn)行的語言,它可以自動多線程運(yùn)行。
下面就小編就和大家淺談一下LabVIEW的線程編程的相關(guān)知識吧!
本文教程:
LabVIEW多線程編程基礎(chǔ)概念
一、單線程與多線程:
LabVIEW在5.0開始才支持多線程,在此之前,LabVIEW其實(shí)是單線程運(yùn)行的。在了解LabVIEW多線程之前,我們需要了解單線程的含義:單線程并不是指代碼固定在某個線程上一直執(zhí)行,系統(tǒng)有可能也會將它切換到其他線程上去運(yùn)行,但是在同一時刻它只會存在于單個線程中,不會有多個線程去同時運(yùn)行這段代碼。而多線程指的是在同一時刻系統(tǒng)可能會在多個線程中同時運(yùn)行代碼。
在LabVIEW中只要程序框圖中的代碼可以并行運(yùn)行(功能模塊之間沒有連線關(guān)系,比如兩個獨(dú)立的While循環(huán)),那么LabIVEW在運(yùn)行這段代碼時就會自動將它們分配在多個線程內(nèi)同時運(yùn)行。
一般情況下,LabVIEW運(yùn)行VI時至少會開辟兩個線程,一個是負(fù)責(zé)刷新界面、響應(yīng)用戶操作控件等界面操作功能的用戶界面線程;另外一個或多個線程是負(fù)責(zé)執(zhí)行除界面操作以外的其他工作,稱之為執(zhí)行線程。
二、LabVIEW的多線程:
如下圖所示,這是兩個獨(dú)立運(yùn)行的While循環(huán),這段代碼在執(zhí)行時會被LabVIEW自動分配到兩個線程中去執(zhí)行。
通過上面這個示例就可以看到,在LabIVEW中編寫多線程程序十分簡便。由于兩個循環(huán)中沒有延時函數(shù),程序會十分快速地執(zhí)行,所以對系統(tǒng)來說它們是兩個較為繁重的線程,一般對于這種任務(wù)繁重的線程,多核CPU計(jì)算機(jī)還會將它們額外安排到不同的CPU內(nèi)核上去運(yùn)行。如下圖所示,運(yùn)行上述示例以后系統(tǒng)自動將它們分配到不同的內(nèi)核中去運(yùn)行,這樣可以合理利用CPU資源,提高程序運(yùn)行速度,節(jié)省程序執(zhí)行時間,防止某個CPU內(nèi)核被100%占用導(dǎo)致卡死。
三、LabVIEW的執(zhí)行系統(tǒng):
LabVIEW自己有一套調(diào)度系統(tǒng),負(fù)責(zé)代碼的調(diào)度和運(yùn)行,這就是LabVIEW的執(zhí)行系統(tǒng)。LabVIEW目前有六個執(zhí)行系統(tǒng),分別是:用戶界面、標(biāo)準(zhǔn)、儀器I/O、數(shù)據(jù)采集以及其他1、其他2執(zhí)行系統(tǒng)。一個應(yīng)用程序中的眾多子VI是可以分別放在不同的執(zhí)行系統(tǒng)里運(yùn)行的,用戶可以在VI屬性中指定VI的執(zhí)行系統(tǒng)。
在LabVIEW支持多線程后,不同執(zhí)行系統(tǒng)中的代碼就被劃分在了不同的線程下運(yùn)行。其中用戶界面執(zhí)行系統(tǒng)只有一個線程,那就是一開始提到的用戶界面線程;其他執(zhí)行系統(tǒng)可以為代碼開辟多個線程。
四、LabVIEW的VI優(yōu)先級:
用戶可以在VI屬性中指定VI的優(yōu)先級屬性。LabVIEW VI優(yōu)先級有后臺、標(biāo)準(zhǔn)、高于標(biāo)準(zhǔn)、高、實(shí)時這六個檔次。其中前五項(xiàng)是從低到高的優(yōu)先級順序,優(yōu)先級越高越容易搶占到CPU資源。而子程序這一項(xiàng)比較特殊,當(dāng)一個VI的優(yōu)先級被設(shè)置為子程序時,VI前面板、調(diào)試信息會被移除(不能用作界面、不能調(diào)試),同時在執(zhí)行該VI時應(yīng)用程序會短暫變?yōu)閱尉€程執(zhí)行,即在這個VI執(zhí)行結(jié)束之前,不會被別的線程打斷;這意味著子程序的VI在執(zhí)行時會得到最多的CPU資源,所以某些純算法的VI,假如不是特別耗時就可以設(shè)置為子程序的優(yōu)先級。
在設(shè)置VI優(yōu)先級時需要注意:1、在一個應(yīng)用程序中,提高一個VI的優(yōu)先級并不能縮短應(yīng)用程序整體占用CPU的時間,只是意味著這個VI會比其他VI更多、更容易搶占到CPU資源,所有VI占用CPU的整體時間是不會變的;2、低優(yōu)先級相對于高優(yōu)先級的VI,并不是高優(yōu)先級的VI會一定先執(zhí)行,只是說明高優(yōu)先級VI有更高的概率搶占到CPU資源;
在單核CPU的計(jì)算機(jī)上,LabVIEW最多為每個執(zhí)行系統(tǒng)下的每個檔次優(yōu)先級開啟四條線程,如果是多核CPU,每增加一個CPU內(nèi)核,可開辟的線程數(shù)目翻倍。實(shí)際上一個程序在運(yùn)行時并不會有那么多優(yōu)先級和執(zhí)行系統(tǒng)設(shè)置,所以并不會開辟很多線程。
小編這里提醒大家編程時線程不是越多越好,因?yàn)榫€程的開辟、銷毀、切換等都是需要消耗資源的,如果線程開的太多,切換線程太頻繁,反而會導(dǎo)致程序執(zhí)行的效率降低。
五、定時結(jié)構(gòu):
對于多核CPU的計(jì)算機(jī),有時候操作系統(tǒng)自動分配線程至CPU內(nèi)核的策略可能并不是最優(yōu)解,于是就需要我們?nèi)斯とブ付ǎ茨硞€線程應(yīng)該被指定到計(jì)算機(jī)的哪個CPU內(nèi)核上執(zhí)行。現(xiàn)在絕大部分計(jì)算機(jī)的CPU性能都足夠強(qiáng)大,所以一般情況下,只有對于執(zhí)行效率要求極其苛刻的程序才會需要我們?nèi)斯とブ付–PU內(nèi)核的分配方案。
需要人工指定CPU分配方案時,我們可以使用定時結(jié)構(gòu)來替換程序中原有的結(jié)構(gòu),定時結(jié)構(gòu)可以更加精確的執(zhí)行某段程序代碼,并且它還包含一些用于高精度定時、處理器分配等的輔助功能,定時結(jié)構(gòu)包含定時循環(huán)結(jié)構(gòu)和定時順序結(jié)構(gòu),如下圖所示:
可以看到相對于普通的循環(huán)或者順序結(jié)構(gòu),定時結(jié)構(gòu)左側(cè)有一些輸入端,可以進(jìn)行一些配置,這些配置可以在程序運(yùn)行過程中使用輸入接線端進(jìn)行動態(tài)設(shè)置,也可以在配置面板中靜態(tài)進(jìn)行設(shè)置,如下圖所示:
在該配置面板中,處理器分配模式就是用來指定CPU的設(shè)置,可以將它選擇為手動模式,然后在后面選擇要分配的CPU內(nèi)核名稱即可。在實(shí)際應(yīng)用中,我們可以將按照執(zhí)行任務(wù)的耗時來劃分,將耗時比較多的任務(wù)單獨(dú)指定在一個CPU中,不同CPU中平衡分配任務(wù),提升程序整體運(yùn)行的速度。
六、并行循環(huán)
前面提到當(dāng)兩個循環(huán)并行運(yùn)行,它們之間沒有數(shù)據(jù)連線時LabVIEW會將它們劃分到兩個不同的線程中去執(zhí)行。那么當(dāng)只有一個循環(huán)時,一般情況下,LabVIEW只會為此循環(huán)開辟一個線程來執(zhí)行,但是如果這個循環(huán)中的代碼本身就比較耗時,那么這段代碼的執(zhí)行效率就會十分低,如下圖所示:
上述示例中的這段代碼執(zhí)行一次需要859ms,屬于相當(dāng)耗時的代碼了,它每次循環(huán)都需要經(jīng)過大量數(shù)學(xué)運(yùn)算,對于這種循環(huán),可以將它配置成并行運(yùn)行模式,在循環(huán)上右鍵并選擇“配置循環(huán)并行”
選擇之后就會看到一個配置窗口:
首先我們需要先勾選“啟用循環(huán)迭代并行”,然后配置生成的并行循環(huán)實(shí)例數(shù)量,一般來說實(shí)例數(shù)最高設(shè)置成計(jì)算機(jī)的內(nèi)核總數(shù)量,設(shè)置數(shù)量超過計(jì)算機(jī)的內(nèi)核數(shù)量就沒有意義了,不會再繼續(xù)提高程序的運(yùn)行速度。
上圖是將原先的示例改為并行循環(huán)并設(shè)置了8個線程之后的執(zhí)行情況,可以看到它的運(yùn)行時間顯著減少,程序的執(zhí)行效率得到了很大的提升。
注意事項(xiàng):
1、配置并行循環(huán)要求循環(huán)內(nèi)部的代碼不能依賴之前循環(huán)運(yùn)算的結(jié)果(比如不能使用反饋節(jié)點(diǎn)和移位寄存器),因?yàn)槿绻绦蛞蕾囍把h(huán)運(yùn)算的結(jié)果就表明這個程序不能并行運(yùn)行,必須強(qiáng)制迭代按順序執(zhí)行,如果強(qiáng)行配置為并行循環(huán)會導(dǎo)致VI報錯無法運(yùn)行。
2、配置為并行循環(huán)的程序無法在循環(huán)內(nèi)部使用探針等調(diào)試手段,如果需要調(diào)試可以勾選配置循環(huán)并行面板中的“允許調(diào)試”,勾選之后它會強(qiáng)制所有并行的線程按照順序迭代,這樣會使并行運(yùn)行的執(zhí)行效率降低到之前的單線程運(yùn)行的水平,所以一般代碼調(diào)試完成后一定要記得取消此勾選項(xiàng)。
七、內(nèi)容總結(jié)
1、明確LabVIEW單線程和多線程的概念;
2、了解LabVIEW自動多線程的相關(guān)知識;
3、熟悉LabVIEW執(zhí)行系統(tǒng)的相關(guān)知識;
4、掌握LabVIEW VI優(yōu)先級設(shè)置及其注意事項(xiàng);
5、學(xué)習(xí)定時結(jié)構(gòu)和并行循環(huán)的使用及注意事項(xiàng);
以上就是有關(guān)LabVIEW多線程編程第一章節(jié)的所有內(nèi)容啦,歡迎大家一起交流探討!下一章小編將會為大家?guī)鞮abVIEW多線程之間的數(shù)據(jù)傳遞相關(guān)的分享,敬請期待!
對LabVIEW編程及相關(guān)知識感興趣的工程師們,歡迎持續(xù)關(guān)注、留言和點(diǎn)贊,也可以私信小編各位的技術(shù)困惑和技術(shù)需求,以獲取參加免費(fèi)線下培訓(xùn)和技術(shù)交流的機(jī)會哦。
審核編輯:湯梓紅
-
LabVIEW
+關(guān)注
關(guān)注
1977文章
3657瀏覽量
325683 -
Vi
+關(guān)注
關(guān)注
3文章
78瀏覽量
21076 -
程序
+關(guān)注
關(guān)注
117文章
3797瀏覽量
81421 -
多線程
+關(guān)注
關(guān)注
0文章
278瀏覽量
20075 -
線程編程
+關(guān)注
關(guān)注
0文章
5瀏覽量
6140
發(fā)布評論請先 登錄
相關(guān)推薦
評論