新聞中心

EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > 同步控制技術(shù)----棧與隊(duì)列

同步控制技術(shù)----棧與隊(duì)列

作者: 時(shí)間:2017-01-09 來(lái)源:網(wǎng)絡(luò) 收藏

計(jì)算機(jī)編程中棧是一個(gè)很重要的概念,尤其在匯編語(yǔ)言中,需要不斷進(jìn)棧和出棧的操作.棧是限定在一個(gè)表的尾端進(jìn)行插入(進(jìn)堆棧)和刪除(出堆棧)的線性表.是后進(jìn)先出結(jié)構(gòu)(LIFO).

本文引用地址:http://butianyuan.cn/article/201701/337266.htm

隊(duì)列的定義和棧的定義是類(lèi)似的,區(qū)別是數(shù)據(jù)是先進(jìn)先出(FIFO)

labview還有一個(gè)概念緩沖區(qū)BUFFER,典型的比如CHART,它默認(rèn)保存數(shù)據(jù)長(zhǎng)度是1024.BUFFER的概念和隊(duì)列是非常相似的,都是一個(gè)先進(jìn)先出的結(jié)構(gòu).如果我們?cè)O(shè)定隊(duì)列的數(shù)據(jù)長(zhǎng)度也是1024.比較一下他們的區(qū)別.

區(qū)別一:未達(dá)到設(shè)定

開(kāi)始的時(shí)候,隊(duì)列和緩沖區(qū)中都是沒(méi)有數(shù)據(jù)的,當(dāng)有數(shù)據(jù)進(jìn)入的時(shí)候,隊(duì)列和緩沖區(qū)中的數(shù)據(jù)在不斷地增加,對(duì)于緩沖區(qū),因?yàn)槲催_(dá)到它最大許可的長(zhǎng)度 1024,因此數(shù)據(jù)是不斷第增加的,隊(duì)列則不同,它的數(shù)據(jù)是否增加取決于是否有讀隊(duì)列的過(guò)程,就是所說(shuō)的出隊(duì),如果出隊(duì)的速度大于入隊(duì)的速度,隊(duì)列中則根本不會(huì)有數(shù)據(jù).如果沒(méi)有出隊(duì)的過(guò)程或者出隊(duì)的速度小于入隊(duì)的過(guò)程,隊(duì)列中的數(shù)據(jù)也是不斷地增加的.這是第一個(gè)區(qū)別.

區(qū)別二:到達(dá)設(shè)定值

當(dāng)隊(duì)列和BUFFER都達(dá)到了1024個(gè)數(shù)據(jù)后,這是再有新的數(shù)據(jù)要進(jìn)來(lái),隊(duì)列和BUFFER的表現(xiàn)是不同的,對(duì)于BUFFER,它將自動(dòng)擠出(形象的說(shuō)法,當(dāng)然也是編程實(shí)現(xiàn)的)最早進(jìn)入BUFFER的數(shù)據(jù),所謂先進(jìn)先出.而隊(duì)列則不同.要求進(jìn)入隊(duì)列的線程只能被動(dòng)等待,一直到隊(duì)列中有別的線程取出數(shù)據(jù),隊(duì)列中有空閑位置.所以隊(duì)列有調(diào)節(jié)讀寫(xiě)速度線程的能力.

相同點(diǎn)一:數(shù)據(jù)進(jìn)入都是在尾部,(隊(duì)列插入如果在頭部,就編程上面所說(shuō)的棧了)

相同點(diǎn)二:對(duì)于中間數(shù)據(jù)都實(shí)現(xiàn)了有效的封裝,你無(wú)法直接提取中間的某個(gè)數(shù)據(jù),你可以讀出中間的數(shù)據(jù),但是不能改變當(dāng)前BUFFER和隊(duì)列的值.


LABVIEW提供的隊(duì)列的功能函數(shù)(包括棧),在逐點(diǎn)分析庫(kù)提供了DBL型的BUFFER,我在另外的日志中專(zhuān)門(mén)提到了,這里就不多說(shuō)了.

LV隊(duì)列的函數(shù)是基本函數(shù),無(wú)法進(jìn)行深入跟蹤,估計(jì)應(yīng)該是采用C++的算法然后封裝的,我實(shí)際測(cè)試過(guò),它的運(yùn)行效率遠(yuǎn)高于用數(shù)組的方式構(gòu)成的隊(duì)列,為了詳細(xì)說(shuō)明隊(duì)列和棧的細(xì)節(jié),我還是用數(shù)組的形式,然后在介紹LV的隊(duì)列函數(shù).

首先看看如何用數(shù)組實(shí)現(xiàn)棧的功能:

棧的操作是非常簡(jiǎn)單的,只有壓棧和出棧兩個(gè)操作(PUSH AND POP)

我們用AE來(lái)實(shí)現(xiàn)它.分成三個(gè)action: Init,Push ,Pop

首先嚴(yán)格自定義ENUM,表示三個(gè)動(dòng)作.










這樣我們就完成了棧的AE的制作過(guò)程。

看看它的調(diào)用過(guò)程。


10次循環(huán),棧中的數(shù)據(jù)應(yīng)該是0,1,2,3,4,5,6,7,8,9。棧的彈出次序應(yīng)該是9,8,7,6,5,4,3,2,1,0

運(yùn)行結(jié)果確實(shí)如此。

與棧相反,隊(duì)列是一個(gè)先入先出的數(shù)據(jù)結(jié)構(gòu),我們對(duì)棧的過(guò)程稍微修改一下,就可以得到隊(duì)列。就不多介紹了。

下面重點(diǎn)介紹一下LV提供的隊(duì)列的具體功能。




分別介紹這8個(gè)節(jié)點(diǎn)的具體功能:
1:獲得隊(duì)列(實(shí)際是得到隊(duì)列的參考)它有5個(gè)數(shù)據(jù)端子

name:String
隊(duì)列在LV系統(tǒng)中是名稱(chēng)來(lái)區(qū)分的,LV系統(tǒng)自己維護(hù)一個(gè)包含的目前所有隊(duì)列的表,當(dāng)你運(yùn)行這個(gè)函數(shù)的時(shí)候,它首先會(huì)查找表中是否已經(jīng)存在這個(gè)隊(duì)列參考,如果存在,就直接返回這個(gè)參考,如果不存在,就建立一個(gè)新的隊(duì)列,并將隊(duì)列參考加入表中進(jìn)行維護(hù)。這樣做的好處是非常明顯的,允許我們?cè)谌魏巫覸I中,只需要知道隊(duì)列的名稱(chēng)就可以運(yùn)行這個(gè)函數(shù)直接得到隊(duì)列參考,不用通過(guò)全局變量或者數(shù)據(jù)流輸入來(lái)得到參考,在一個(gè)層層嵌套的VI中想傳遞一個(gè)數(shù)據(jù)很不容易,也不利于模塊化。


max queue size:I32

定義的隊(duì)列的最大長(zhǎng)度,當(dāng)輸入-1時(shí),隊(duì)列長(zhǎng)度不受限制,需要注意的是,如果取出數(shù)據(jù)的速度小于加入隊(duì)列數(shù)據(jù)的速度,隨著時(shí)間的推移,需要的內(nèi)存會(huì)不斷地增加,這顯然是存在問(wèn)題的,如果我們沒(méi)有規(guī)定最大長(zhǎng)度的話,編程時(shí)候要注意自己來(lái)協(xié)調(diào)速度。如果規(guī)定的最大長(zhǎng)度,當(dāng)達(dá)到最大長(zhǎng)度時(shí)候,加入隊(duì)列的線程會(huì)一直等待到隊(duì)列中有空閑位置為止。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 同步控制棧隊(duì)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉