亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        通用線程模型研究

        2014-11-28 13:22:34王靖WANGJing楊成YANGCheng
        價(jià)值工程 2014年26期
        關(guān)鍵詞:分派線程隊(duì)列

        王靖WANG Jing;楊成YANG Cheng

        (①北京信息職業(yè)技術(shù)學(xué)院信息工程系,北京 100018;②北京星網(wǎng)銳捷網(wǎng)絡(luò)技術(shù)有限公司,北京 100082)

        (①Department of Information Engineering,Beijing Information Teconology College,Beijing 100018,China;②Beijing Star-net Communication Co.,Ltd.,Beijing 100082,China)

        0 引言

        在現(xiàn)代應(yīng)用程序中,為了用戶界面的更加友好,程序運(yùn)行的更加流暢,使用多線程進(jìn)行任務(wù)的處理已經(jīng)是主流的選擇。但是多線程程序開(kāi)發(fā)中,我們往往會(huì)遇到以下問(wèn)題:

        ①在訪問(wèn)共享的數(shù)據(jù)時(shí),使用加鎖方式實(shí)現(xiàn)。但這種方式在程序規(guī)模增長(zhǎng)到一定程度后,會(huì)不可避免地帶來(lái)程序的低效、死鎖等問(wèn)題。②簡(jiǎn)單地為每個(gè)耗時(shí)的任務(wù)創(chuàng)建一個(gè)線程;這種模式首先造成資源的浪費(fèi),其次當(dāng)大量線程被創(chuàng)建出后,會(huì)耗盡系統(tǒng)的資源從而導(dǎo)致系統(tǒng)變慢或死機(jī);即使是正常關(guān)閉,大量線程在關(guān)閉時(shí)的等待也將是一個(gè)漫長(zhǎng)的過(guò)程。③任務(wù)執(zhí)行完后,通過(guò)回調(diào)通知發(fā)起者任務(wù),但可能發(fā)起者已被銷毀,從而導(dǎo)致程序的崩潰。

        采用線程模型,及約定開(kāi)發(fā)人員以事先制定的模式工作,能避免上述問(wèn)題。線程模型的設(shè)計(jì)目標(biāo)概括為以下幾點(diǎn):

        ①除了在線程模型的管理和調(diào)度模塊,整個(gè)應(yīng)用程序避免使用任何形式的鎖。這樣能避免程序低效、死鎖等問(wèn)題。②線程模型應(yīng)提供能動(dòng)態(tài)調(diào)整的線程池來(lái)執(zhí)行用戶提交的任務(wù)。③線程模型應(yīng)提供統(tǒng)一的接口讓用戶提交任務(wù)、設(shè)定定時(shí)任務(wù)、設(shè)定任務(wù)過(guò)期條件、取消任務(wù)、存儲(chǔ)任務(wù)和提供回調(diào)等,避免在每個(gè)模塊做同樣的工作。④合理調(diào)度任務(wù),保證共享數(shù)據(jù)的安全。⑤線程模型應(yīng)管理每個(gè)服務(wù)和回調(diào)的生命周期,使應(yīng)用

        程序避免崩潰。

        如圖1 所示,用戶任務(wù)通過(guò)線程模型接口提交,提交過(guò)程是異步的,可立即返回;任務(wù)通過(guò)線程模型接口,添加到服務(wù)存儲(chǔ)和管理隊(duì)列;任務(wù)分派程序會(huì)選擇合適的任務(wù)提交到線程池中,執(zhí)行用戶的任務(wù),完成時(shí)調(diào)用回調(diào)函數(shù);通過(guò)生命周期管理,當(dāng)回調(diào)的對(duì)象銷毀時(shí),自動(dòng)取消回調(diào)。

        圖1 線程模型圖示

        1 線程模型的組成部分及其功能

        一個(gè)完整的線程模型至少應(yīng)包含以下組成部分:

        ①線程模型接口;②任務(wù)存儲(chǔ)和調(diào)度線程的管理;③任務(wù)的分派;④線程池的管理;⑤線程模型的輔助設(shè)施。

        1.1 線程模型的接口

        1.1.1 創(chuàng)建線程模型管理 線程管理模塊在主程序入口處被創(chuàng)建。確保用戶的各個(gè)模塊都能調(diào)用到線程模型的各種接口。

        1.1.2 銷毀線程模型管理 線程管理模塊在主程序出口處被銷毀。銷毀時(shí),線程管理模塊保證正在被執(zhí)行的任務(wù)執(zhí)行完,同時(shí)取消正在隊(duì)列中等待的所有任務(wù)。

        1.1.3 添加一個(gè)新的任務(wù) 線程模型提供輔助設(shè)施來(lái)協(xié)助用戶創(chuàng)建任務(wù)。任務(wù)將有6 個(gè)屬性:command,callback,task_id,group_id,priority 和timeout。

        1.1.4 設(shè)定任務(wù)分組 如果有些任務(wù)需要訪問(wèn)共享的數(shù)據(jù),這些任務(wù)將按順序被放入線程池執(zhí)行,避免多線程同時(shí)訪問(wèn)共享數(shù)據(jù)。通過(guò)給這些任務(wù)賦予相同的ID,任務(wù)分派模塊就會(huì)自動(dòng)的將相同ID 的任務(wù)順序放入線程池。

        1.1.5 設(shè)定任務(wù)回調(diào) 任務(wù)回調(diào)在任務(wù)執(zhí)行完成后被工作線程調(diào)用,回調(diào)過(guò)程如需線程切換,可通過(guò)線程模型的輔助設(shè)施來(lái)實(shí)施。

        1.1.6 設(shè)置任務(wù)優(yōu)先級(jí) 每項(xiàng)任務(wù)都有自己的優(yōu)先級(jí),高優(yōu)先級(jí)的任務(wù)將優(yōu)先被放進(jìn)線程池執(zhí)行。

        1.1.7 任務(wù)超時(shí) 有的任務(wù)會(huì)有一個(gè)執(zhí)行的期限,如超過(guò)這個(gè)期限,回調(diào)函數(shù)將被執(zhí)行。

        1.1.8 取消任務(wù) 用戶發(fā)起任務(wù)后,在等待任務(wù)執(zhí)行的過(guò)程中,可能需要取消任務(wù)。此時(shí),如任務(wù)在等待的隊(duì)列中,任務(wù)將被刪除。如任務(wù)已在線程池中被執(zhí)行,則斷開(kāi)該任務(wù)連接的回調(diào)函數(shù)。

        1.1.9 重試任務(wù) 在某個(gè)任務(wù)失敗后,回調(diào)函數(shù)會(huì)通知用戶此次執(zhí)行失敗和失敗的原因。用戶可通過(guò)重試該項(xiàng)任務(wù),重新將任務(wù)發(fā)送到存儲(chǔ)隊(duì)列中等待執(zhí)行。

        1.1.10 預(yù)約任務(wù) 用戶希望在一段時(shí)間后啟動(dòng)某些項(xiàng)任務(wù),需要接口支持預(yù)約任務(wù)。

        1.2 任務(wù)存儲(chǔ)和調(diào)度線程的管理

        1.2.1 任務(wù)及其回調(diào)的存儲(chǔ) 采用多索引容器(boost::multi_index_container)形式來(lái)存儲(chǔ)任務(wù),同時(shí)按照task id,priority 和group id 為任務(wù)建立不同的索引。這樣,不但在查找相應(yīng)任務(wù)時(shí)效率更高,而且也保證了插入或者刪除數(shù)據(jù)時(shí)候的效率。[1]

        1.2.2 任務(wù)管理及回調(diào) ①由于用戶可能在任意的線程調(diào)用線程模型,來(lái)添加希望的服務(wù)。為避免本文開(kāi)始提到的對(duì)共享數(shù)據(jù)加鎖的問(wèn)題,需將任務(wù)的添加工作切換到任務(wù)管理線程執(zhí)行。②維護(hù)用戶任務(wù)的狀態(tài),Scheduling,Pending or Processing 也需在管理線程進(jìn)行。③在回調(diào)發(fā)生的時(shí)候,需移除相應(yīng)任務(wù)并觸發(fā)用戶預(yù)先設(shè)定的回調(diào)?;卣{(diào)必須在管理線程中執(zhí)行,需檢查管理線程中該任務(wù)是否被取消。④用戶可能不斷添加新任務(wù),線程池會(huì)添加任務(wù)完成的事件到管理線程。同時(shí),用戶可能會(huì)取消之前添加的任務(wù)。以上操作會(huì)影響到共同數(shù)據(jù),因此必須按順序執(zhí)行。但這樣會(huì)導(dǎo)致大量添加新任務(wù)的操作,導(dǎo)致分派任務(wù)一直無(wú)法得到執(zhí)行;在這種情況下,管理線程一直處于忙碌狀態(tài),但是線程池卻處于空閑狀態(tài)。因此,對(duì)于不同的任務(wù)的添加,也需設(shè)定優(yōu)先級(jí)。一般來(lái)說(shuō),完成任務(wù)的優(yōu)先級(jí)設(shè)為Medium,用戶取消任務(wù)的優(yōu)先級(jí)設(shè)為High,而添加任務(wù)的優(yōu)先級(jí)設(shè)定為L(zhǎng)ow。

        1.2.3 防止任務(wù)無(wú)限制占據(jù)線程 對(duì)線程模型來(lái)說(shuō),用戶創(chuàng)建的任務(wù)是不可控的。因此,會(huì)發(fā)生由于用戶任務(wù)錯(cuò)誤導(dǎo)致線程池的線程進(jìn)入死循環(huán),使得線程喪失繼續(xù)服務(wù)的能力。線程調(diào)度管理程序如不能及時(shí)發(fā)現(xiàn)死去的線程,將有可能導(dǎo)致線程池所有線程被占用,從而導(dǎo)致用戶所有任務(wù)均無(wú)法執(zhí)行。一般可以記錄上次該線程回調(diào)發(fā)生的時(shí)間。如超過(guò)指定時(shí)間范圍而無(wú)響應(yīng),可強(qiáng)制該線程關(guān)閉后重啟或者關(guān)閉相應(yīng)任務(wù),并重新添加線程到線程池。

        1.2.4 定時(shí)器組件 為實(shí)現(xiàn)用戶預(yù)約任務(wù),必須實(shí)現(xiàn)Timeout 部件,并在到期時(shí),將回調(diào)的執(zhí)行過(guò)程控制在管理線程中。實(shí)踐中,可考慮用Boost::asio::deadline_timer。

        1.2.5 內(nèi)存池的管理 當(dāng)?shù)却蝿?wù)多時(shí),增加線程池中線程的數(shù)量。當(dāng)?shù)却?duì)列很少或?yàn)榭諘r(shí),減少線程數(shù)量。增加減少不宜太頻繁。一般根據(jù)一段時(shí)間內(nèi)處理的任務(wù)數(shù)來(lái)決定開(kāi)啟的線程數(shù)。

        1.2.6 任務(wù)回調(diào)的生命周期管理 對(duì)于回調(diào)任務(wù),一般需做兩件事。第一,確?;卣{(diào)發(fā)生在指定線程。這一點(diǎn),1.4 節(jié)將會(huì)專門講述。第二,確?;卣{(diào)所依賴的對(duì)象存在;如所依賴的對(duì)象已被銷毀,那么就取消該回調(diào)。實(shí)現(xiàn)可采用boost::signal 模式,只要求回調(diào)所依賴的目標(biāo)對(duì)象從boost::signals::trackable[2]派生即可。

        1.3 任務(wù)的分派 任務(wù)的分派需要遵循以下原則:

        ①分派單元的運(yùn)行需確保在任務(wù)管理線程中執(zhí)行。②分派單元按優(yōu)先級(jí)取任務(wù),放入隊(duì)列中執(zhí)行。③如果標(biāo)記為某個(gè)group id 的任務(wù)已在線程池中運(yùn)行,那么該任務(wù)結(jié)束前,同樣group id 的任務(wù)不能被再次放入。④添加任務(wù)時(shí)和complete task 時(shí)均可嘗試重新分派任務(wù)。

        1.4 線程池的管理 線程池需提供的功能有:

        ①啟動(dòng)指定數(shù)目的線程。②任務(wù)能夠通過(guò)接口添加到線程池的隊(duì)列中。③運(yùn)行時(shí)動(dòng)態(tài)增減線程數(shù)量。④退出時(shí)確保運(yùn)行中的任務(wù)執(zhí)行完畢。

        1.5 線程模型的輔助設(shè)施 線程模型需要提供的輔助設(shè)置有:

        ①創(chuàng)建任務(wù)。②創(chuàng)建回調(diào)命令。③提供Factory 機(jī)制,使目標(biāo)線程可以注冊(cè)相應(yīng)的命令到Factory。該命令可將任意命令切換到線程執(zhí)行。

        2 線程模型的執(zhí)行過(guò)程

        線程模型執(zhí)行的過(guò)程如圖2 所示。

        圖2 線程模型執(zhí)行過(guò)程

        線程模型的使用者通過(guò)接口創(chuàng)建線程模型并拿到需要的接口。通過(guò)線程模型提供的輔助函數(shù)生成任務(wù)后,調(diào)用線程模型接口,把任務(wù)添加到線程模型管理的任務(wù)隊(duì)列。管理線程,在任務(wù)隊(duì)列不為空時(shí),選擇合適的任務(wù),并將完成任務(wù)的事件和任務(wù)命令綁定。將組裝好的命令放入線程池中去運(yùn)行。執(zhí)行完畢后,完成任務(wù)的事件被觸發(fā),并切換到管理線程。該事件將進(jìn)行下一輪任務(wù)分派。

        3 線程模型優(yōu)化策略

        對(duì)于不同的應(yīng)用場(chǎng)合,線程模型有著不同的優(yōu)化策略。優(yōu)化策略一般考慮的環(huán)節(jié)有:

        ①是否充分利用每個(gè)線程的執(zhí)行能力。②是否最大限度地減少了任務(wù)在線程之間的調(diào)度。③有些任務(wù)只讀共享的數(shù)據(jù),有些需寫(xiě)那些數(shù)據(jù)。如果能將讀寫(xiě)任務(wù)區(qū)分對(duì)待,那么讀數(shù)據(jù)的任務(wù)就可以同時(shí)添加到線程池中。④調(diào)度管理程序處理添加和完成任務(wù)的優(yōu)先順序,及任務(wù)的存儲(chǔ)結(jié)構(gòu)。⑤任務(wù)隊(duì)列的動(dòng)態(tài)規(guī)劃。

        4 總結(jié)

        無(wú)論在客戶端UI 編程,還是在服務(wù)端編程,線程模型都是一個(gè)非常重要的設(shè)施,能提高程序的穩(wěn)定性和可維護(hù)性。對(duì)于規(guī)模較大的系統(tǒng),這是一項(xiàng)非常重要的基礎(chǔ)設(shè)施。本文結(jié)合在工程中的實(shí)踐經(jīng)驗(yàn),詳盡分析了設(shè)計(jì)一個(gè)線程模型時(shí)需考慮的目標(biāo)、結(jié)構(gòu)、接口及模型的工作流。實(shí)踐中,這種線程模型能幫助應(yīng)用程序簡(jiǎn)化設(shè)計(jì),提高穩(wěn)定性,提升效率。

        [1]王鳳嶺.分布式操作系統(tǒng)中線程包實(shí)現(xiàn)方法的對(duì)比研究[J].南寧職業(yè)技術(shù)學(xué)院學(xué)報(bào),2004(04).

        [2]陳矯陽(yáng),陳楸,劉桓龍.基于LabWindows/CVI 多線程數(shù)據(jù)采集的研究[J].科學(xué)技術(shù)與工程,2008(09).

        [3]周仕祥,劉伯恕.Boost 功率因數(shù)校正器的效率和空載損耗研究[J].電力電子技術(shù),2003(03).

        [4]肖和平,韓偉紅,賈焰,吳泉源.StarCCM2.0 中高性能線程池模型的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2005(24).

        猜你喜歡
        分派線程隊(duì)列
        隊(duì)列里的小秘密
        基于多隊(duì)列切換的SDN擁塞控制*
        軟件(2020年3期)2020-04-20 00:58:44
        在隊(duì)列里
        《宋元學(xué)案》中程頤思想的詮釋與評(píng)價(jià)——兼論二程思想的比較及其分派
        論勞思光對(duì)宋明儒學(xué)分派問(wèn)題的研究
        豐田加速駛?cè)胱詣?dòng)駕駛隊(duì)列
        快遞小哥的一天
        新民周刊(2017年9期)2017-03-20 17:45:04
        淺談linux多線程協(xié)作
        跟蹤導(dǎo)練(四)
        Linux線程實(shí)現(xiàn)技術(shù)研究
        狠狠色婷婷久久综合频道日韩| 97久久精品人人妻人人| 国内精品久久久久久无码不卡| 中文字幕久久精品波多野结百度| 蜜桃视频成年人在线观看| 亚洲第一页视频在线观看| 免费看黄色亚洲一区久久| 久久久久久久综合综合狠狠| 香蕉人妻av久久久久天天| 特级毛片a级毛片在线播放www| 国产熟女白浆精品视频二| 国产不卡视频一区二区三区| 精品国产乱码久久久久久1区2区 | 亚洲亚洲人成综合网络| 少妇厨房愉情理伦片免费| 狠狠色狠狠色综合| 国产精品一区二区三密桃| 中文字幕国产亚洲一区| 久久视频在线| 国产女人18一级毛片视频| 蜜臀一区二区av天堂| 国产精品日韩av一区二区| 久久精品夜色噜噜亚洲a∨| 免费看泡妞视频app| 国产精品亚洲综合久久婷婷| 亚洲av精品一区二区三| 中文字幕午夜精品一区二区三区| 美女下蹲露大唇无遮挡| 国产精品国产三级国av在线观看| 午夜tv视频免费国产区4| 蜜桃精品国产一区二区三区| 亚洲sm另类一区二区三区| 久久精品国产免费观看| 日本三级欧美三级人妇视频 | 久久久精品人妻一区二区三区日本 | 老熟女重囗味hdxx70星空| 911国产精品| 久久少妇呻吟视频久久久| 国产免费牲交视频| 久久精品国产视频在热| 人妻无码中文专区久久五月婷 |