天天看點

軟體開發實踐中的入隊列和出隊列操作的C代碼示例

概述

最近有在校的學生朋友在問我,資料結構中的隊列在實際的軟體開發項目中有什麼樣的用處。

大家都知道,隊列的特點是先入先出,即資料是按照入隊列的順序出隊列的。在實際的軟體開發項目中,當一個中間子產品需要接收和發送大量的消息時,隊列就可以大展身手了。我們可以将接收到的資料存儲在一個全局隊列中,然後在另外的程式流程中将資料從同一個全局隊列中取出來,經過一定的處理之後将消息發送到另外的子產品。這樣做可以降低程式的性能瓶頸。

本文用實際的C代碼示例了簡單的資料入隊列和出隊列的方法,大家可據此了解隊列的實際用法,也可參照來實作更加複雜的隊列操作。

C代碼

程式運作情況

我們将上面編寫好的QueueUse.c檔案上傳到Linux機器上,使用“gcc -g -o QueueUseQueueUse.c”指令編譯之後,生成QueueUse檔案。之後,執行“QueueUse”指令,即可看到程式的運作結果(結果會不斷地更新)如下:

~/zhouzx/Test/QueueUse> QueueUse PutDataIntoQueue: ID=0, Info=zhou0 GetDataFromQueue: ID=0, Info=zhou0 PutDataIntoQueue: ID=1, Info=zhou1 GetDataFromQueue: ID=1, Info=zhou1 PutDataIntoQueue: ID=2, Info=zhou2 GetDataFromQueue: ID=2, Info=zhou2 PutDataIntoQueue: ID=3, Info=zhou3 GetDataFromQueue: ID=3, Info=zhou3

我們看到,資料先是被加入到隊列中,然後再從隊列中取出來。

程式說明

第一,在本程式中,入隊列和出隊列是在同一個函數中完成的,但是,在實際開發項目的程式中,入隊列和出隊列一般是在不同的程式流程(兩個不同的線程)中完成的。

第二,本程式的資料入隊列操作是在EnQueue函數中完成的,資料出隊列操作是在DeQueue函數中完成的,全局變量g_tQueue用于存放需要處理的資料。

第三,在實際開發項目的程式中,有可能會有很多流程都會調用入隊列和出隊列的函數,為了防止多個流程同時向隊列中加入資料或取出資料,在EnQueue和DeQueue函數中使用了鎖操作。也就是說,在操作資料之前,先用pthread_mutex_lock函數執行加鎖操作,在處理完資料之後,再用pthread_mutex_unlock函數執行解鎖操作。

第四,在實際開發項目中,為了防止程式從隊列中取資料的速率過快而使得下遊子產品處理不過來,我們常在從隊列取出資料之後發消息的流程中控制資料的發送速率,具體每秒鐘發送多少條可在配置檔案中設定。

繼續閱讀