李小明 廣東省郵政信息技術(shù)局,廣東 廣州 510006
多線程技術(shù)在繳費易系統(tǒng)中的應(yīng)用
李小明 廣東省郵政信息技術(shù)局,廣東 廣州 510006
介紹了在linux平臺下c語言實現(xiàn)的一種線程池,并在繳費易電信充值異常處理中的得到應(yīng)用。使用該線程池可以動態(tài)創(chuàng)建管理線程,空閑時回收資源。在電信充值異常處理的過程中起到了關(guān)鍵的作用。
電信充值;多線程;并發(fā)訪問
電信充值異常處理的過程中使用到了多進(jìn)程和多線程。使用子進(jìn)程負(fù)責(zé)處理主要邏輯并在子進(jìn)程中創(chuàng)建多個線程,每個線程負(fù)責(zé)處理單獨的異常邏輯。在主進(jìn)程中監(jiān)控管理子進(jìn)程。
進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的最小單位。進(jìn)程創(chuàng)建通常調(diào)用fork實現(xiàn)。創(chuàng)建后子進(jìn)程和父進(jìn)程指向同一內(nèi)存區(qū)域,當(dāng)子進(jìn)程有寫動作發(fā)生時,會把變動的區(qū)域拷貝到子進(jìn)程新的地址空間,這樣可以在很大程度上提高創(chuàng)建進(jìn)程的速度。
當(dāng)運行一個程序時就相當(dāng)于啟動了一個獨立進(jìn)程。單CPU系統(tǒng)同時運行多個進(jìn)程,需要使用并發(fā)技術(shù),一般采用“時間片輪轉(zhuǎn)進(jìn)程調(diào)度算法”,核心思想為:所有運行的進(jìn)程輪流使用CPU,但每個進(jìn)程允許獨占CPU的時間很短,足以讓用戶感覺不出來CPU是在輪流為多個進(jìn)程服務(wù)。但實際上在任意時間點有且僅有一個進(jìn)程獨占有CPU。如果是多個CPU的系統(tǒng),多個進(jìn)程就是可以真正的同時運行。
線程是進(jìn)程的一個實體,是CPU分配和調(diào)度的最小單位。線程基本上不擁有系統(tǒng)資源。多線程可以使多個線程并行的工作以完成一個業(yè)務(wù)邏輯單元,這樣可以有效的提高系統(tǒng)效率。
交費易系統(tǒng)設(shè)計實現(xiàn)中面臨業(yè)務(wù)邏輯比較復(fù)雜、業(yè)務(wù)數(shù)據(jù)量比較大、對數(shù)據(jù)實時處理性能要求比較高、對健壯性和安全性要求比較高、要求系統(tǒng)跨平臺,因此設(shè)計過程中采用了以業(yè)務(wù)邏輯單元來劃分進(jìn)程。一個獨立的業(yè)務(wù)邏輯可以用一個單獨的進(jìn)程來運行管理。因此,將電信充值異常處理單獨設(shè)計成一個獨立進(jìn)程來完成業(yè)務(wù)邏輯。
由于異常情況常常無法預(yù)料并且時有發(fā)生故需要頻繁創(chuàng)建銷毀線程來處理,這樣在一定程度上會消耗更多系統(tǒng)資源,導(dǎo)致效率不高,因此采用提前創(chuàng)建需要數(shù)量的線程并使用線程池來管理線程。
在業(yè)務(wù)處理過程中需要和第三方交費易通信,包括發(fā)送、接收報文、加密解密、驗證有效性等。進(jìn)程間通訊使用套接字,這是由于使用Socket可以有效地支持分布式部署,而且可以在多種編程語言上比較容易地實現(xiàn)。
線程池的設(shè)計主要包括:首先在應(yīng)用開始執(zhí)行時從配置文件讀取線程池的大小,創(chuàng)建并初始化線程池,將程序處理過程關(guān)鍵信息記錄到日志中。然后,創(chuàng)建一個調(diào)度函數(shù),當(dāng)有新任務(wù)時創(chuàng)建或調(diào)度一個線程完成業(yè)務(wù)邏輯,當(dāng)線程池中線程數(shù)小于最大線程數(shù)并且無閑置線程時則創(chuàng)建新線程,否則使用或等待有空閑線程處理。使用線程條件鎖pthread_cond_t和線程互斥鎖pthread_mutex_t對線程池進(jìn)行管理。當(dāng)所有線程都被占用時加鎖等待直到有空閑線程才使用空閑線程處理。最后,在使用完一個線程后放入線程池中等待繼續(xù)使用,并使用 pthread_cond_signal喚醒等待線程。當(dāng)發(fā)生異常或中斷時等待所有線程處理完畢后回收線程占用的資源。
充值中如出現(xiàn)第三方返回超時則記錄訂單狀態(tài)為超時,并由后臺異常處理程序在獨立線程中以socket短連接的方式給第三方發(fā)送沖正申請查詢交易,如果返回成功則根據(jù)返回結(jié)果更新訂單狀態(tài),如果超時無返回,則記錄該訂單為待沖正狀態(tài),并由后臺沖正程序向第三方發(fā)起沖正交易。
根據(jù)線程池的設(shè)計可以在線程創(chuàng)建函數(shù)里調(diào)用充值異常處理函數(shù),此函數(shù)主要包括:數(shù)據(jù)庫讀寫操作,socket通信等。數(shù)據(jù)庫操作主要包括:打開、關(guān)閉數(shù)據(jù)庫連接;讀取,修改訂單狀態(tài);根據(jù)第三方返回值回滾額度;記錄日志及流水等。socket通信主要包括:按協(xié)議組裝發(fā)送報文及接收分解報文。
該線程池在電信業(yè)務(wù)異常處理的應(yīng)用中通過在多并發(fā),大數(shù)據(jù)量,持續(xù)性等驗證中表現(xiàn)穩(wěn)定,為以后的項目提供了借鑒和參考的作用。
[1]鄭燕飛,余海燕. Linux 得多線程機(jī)制探討與實踐[J].計算機(jī)應(yīng)用.2001
[2]周麗等.LINUX系統(tǒng)下多線程與多進(jìn)程性能分析.微計算機(jī)信息.2005
[3]王楓,羅家融.Linux 下多線程Socket 通訊的研究與應(yīng)用[J].計算機(jī)工程與應(yīng)用.2004
參考文獻(xiàn)
[1]冼土明等.基于ZigBee-GPRS 技術(shù)的無線傳感網(wǎng)絡(luò)[J].軟件2011第32卷第1期:58-60
李小明(1981年04月),男,陜西漢中,軟件開發(fā)工程師,研究方向:分布式應(yīng)用、應(yīng)用系統(tǒng)架構(gòu)設(shè)計開發(fā)。
10.3969/j.issn.1001-8972.2011.15.052