查看: 2800|回復: 0
打印 上一主題 下一主題

利用C++語(yǔ)言設計可擴展線(xiàn)程池

[復制鏈接]
跳轉到指定樓層
樓主
發(fā)表于 2014-4-11 01:40:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關(guān)鍵詞: c語(yǔ)言 , c++
  摘要:在各種業(yè)務(wù)解決方案的設計中,服務(wù)器處理任務(wù)的效率是衡量方案優(yōu)劣的一個(gè)重要標準。使用多線(xiàn)程技術(shù)并發(fā)處理任務(wù)是提高服務(wù)器效率的一個(gè)主要手段。但是頻繁的線(xiàn)程創(chuàng )建、銷(xiāo)毀和任務(wù)的分配也會(huì )降低系統效率。本文設計了一個(gè)通用的線(xiàn)程池,根據不同服務(wù)器所處理的任務(wù)的特點(diǎn),可以設置對應的線(xiàn)程池參數,最大幅度的提高系統性能。
  關(guān)鍵字:線(xiàn)程池多線(xiàn)程任務(wù)虛函數異常
  概述
  在各種業(yè)務(wù)解決方案的設計過(guò)程中,服務(wù)器處理任務(wù)的效率往往決定了方案的成敗。多線(xiàn)程處理任務(wù)是提高服務(wù)器效率的主要手段,它提高了對服務(wù)器資源的利用,使得任務(wù)可以并發(fā)處理。但如果服務(wù)器處理的任務(wù)的特點(diǎn)是輕量級、頻率高,那么線(xiàn)程的創(chuàng )建與銷(xiāo)毀會(huì )非常頻繁,而系統用于處理線(xiàn)程的創(chuàng )建與銷(xiāo)毀的開(kāi)銷(xiāo)會(huì )占相當大的比重,反而降低了系統的效率。通過(guò)線(xiàn)程池技術(shù),可以減少頻繁的線(xiàn)程的創(chuàng )建與銷(xiāo)毀對系統性能的影響。
  線(xiàn)程池是預先創(chuàng )建線(xiàn)程的一種技術(shù)。線(xiàn)程池在還沒(méi)有任務(wù)到來(lái)之前,創(chuàng )建一定數量(N1)的線(xiàn)程,放入空閑隊列中。這些線(xiàn)程都是處于阻塞(Suspended)狀態(tài),不消耗CPU,但占用較小的內存空間。當任務(wù)到來(lái)后,緩沖池選擇一個(gè)空閑線(xiàn)程,把任務(wù)傳入此線(xiàn)程中運行。當N1個(gè)線(xiàn)程都在處理任務(wù)后,緩沖池自動(dòng)創(chuàng )建一定數量的新線(xiàn)程,用于處理更多的任務(wù)。當系統比較空閑時(shí),大部分線(xiàn)程都一直處于暫停狀態(tài),線(xiàn)程池自動(dòng)銷(xiāo)毀一部分線(xiàn)程,回收系統資源。
  通用線(xiàn)程緩沖池的設計,不僅要實(shí)現上述功能,還要考慮此設計的可移植性,減少重復開(kāi)發(fā)。設計中需要考慮的重點(diǎn)是:
任務(wù)對象的通用性;線(xiàn)程創(chuàng )建和銷(xiāo)毀策略;任務(wù)的分配策略! 》治雠c設計
  1、任務(wù)對象的通用性
  不同的業(yè)務(wù)解決方案有各自獨特的任務(wù)處理方法,任務(wù)的劃分上也就千差萬(wàn)別。為了使得在處理任務(wù)對象的時(shí)候達到一定程度的通用性,任務(wù)對象的設計上必須與實(shí)際任務(wù)的處理邏輯完全無(wú)關(guān)。從任務(wù)執行的角度看,任務(wù)不過(guò)是處理流程的一次或者多次執行的過(guò)程,可以這樣來(lái)定義任務(wù)接口:
class Task
{
public:
Task();
virtual ~Task();
virtual bool run() = 0;
};
  Task類(lèi)是所有任務(wù)類(lèi)的基類(lèi),其中的純虛函數run()是任務(wù)流程的入口,工作線(xiàn)程在處理任務(wù)的時(shí)候就從此處開(kāi)始執行任務(wù)的處理流程。設計一個(gè)新的任務(wù)時(shí),只需要繼承Task接口,新的任務(wù)就可以放入線(xiàn)程池中執行。
  任務(wù)的創(chuàng )建、執行和銷(xiāo)毀這樣來(lái)設計:
  (1)任務(wù)在其需要的時(shí)候才創(chuàng )建。任務(wù)的創(chuàng )建通過(guò)new操作,動(dòng)態(tài)創(chuàng )建具體的任務(wù)對象,然后傳入線(xiàn)程池,由線(xiàn)程池自動(dòng)分配線(xiàn)程來(lái)執行此任務(wù)。
  (2)任務(wù)是否執行完畢由其自身來(lái)決定。一個(gè)未知任務(wù)什么時(shí)候執行完畢是不可能預測的,必須任務(wù)本身來(lái)決定。這個(gè)策略通過(guò),Task::run()的返回值來(lái)實(shí)現。當工作線(xiàn)程執行一次任務(wù)時(shí),如果返回值為true,表示任務(wù)執行完畢,就用delete操作銷(xiāo)毀此任務(wù);如果返回值為false,表示任務(wù)需要執行的工作并未完成,繼續執行此任務(wù)。
  這樣的策略,使得在設計新的任務(wù)處理流程的時(shí)候,不需要過(guò)多的關(guān)心任務(wù)的接口規范,只需要在新任務(wù)類(lèi)的構造函數中初始化各種資源,在新任務(wù)類(lèi)的析構函數中回收資源,在run()方法中實(shí)現主要的處理邏輯,那么新的任務(wù)類(lèi)即可在線(xiàn)程池中執行。
  2、線(xiàn)程的創(chuàng )建與銷(xiāo)毀
  線(xiàn)程緩沖池中的維持的線(xiàn)程數量應該按照任務(wù)處理的需求來(lái)定。
  在緩沖池剛剛建立時(shí),線(xiàn)程池中有一定數量(N1)的已創(chuàng )建好的線(xiàn)程,這樣可以使得新任務(wù)可以及時(shí)的得到執行。比如,某客戶(hù)端在向服務(wù)器發(fā)送登陸請求的時(shí)候,這樣一個(gè)請求使得服務(wù)器通常需要創(chuàng )建好幾個(gè)相互有關(guān)聯(lián)的任務(wù)。也就是說(shuō),客戶(hù)端與服務(wù)器端的一次交互,通常會(huì )產(chǎn)生一定數量的任務(wù)。根據一個(gè)服務(wù)器所處理的業(yè)務(wù),估計出平均情況下,一次業(yè)務(wù)產(chǎn)生的任務(wù)數量N2。那么N1應該是N2的整數倍,N1=N2×n1,減少由于線(xiàn)程不夠而再創(chuàng )建線(xiàn)程的概率,才能使得服務(wù)器在業(yè)務(wù)處理初期最為高效。
  在線(xiàn)程緩沖池中的所有線(xiàn)程都處于繁忙狀態(tài)的時(shí)候,線(xiàn)程池就會(huì )創(chuàng )建新的線(xiàn)程,設創(chuàng )建N3個(gè)。由以上分析,為了減少由于線(xiàn)程不夠而再創(chuàng )建線(xiàn)程的概率,N3也應該是N2的整數倍,N3=N2×n2。
  當服務(wù)器業(yè)務(wù)減少,出現大量線(xiàn)程閑置的情況,就應該銷(xiāo)毀一部分線(xiàn)程。很顯然,這里應該使用超時(shí)策略,當某些線(xiàn)程在超過(guò)時(shí)間T仍然處于閑置狀態(tài),就銷(xiāo)毀一部分空閑線(xiàn)程。設銷(xiāo)毀N4個(gè)空閑線(xiàn)程,為了減少由于線(xiàn)程不夠而再創(chuàng )建線(xiàn)程的概率,N4也應該是N2的整數倍,N4=N2×n3。當然,為了使得新任務(wù)及時(shí)得到處理,即使服務(wù)器一直處于空閑,也應該保留N1個(gè)線(xiàn)程。

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页