消息通信過程可以采取輪詢或者中斷兩種方式,本文嘗試對(duì)輪詢法的一個(gè)缺陷做出分析。
一般輪詢法的框架:
在一般小程序中采取該方法并沒有任何問題,但是,在一個(gè)復(fù)雜系統(tǒng)中擔(dān)負(fù)底層通信任務(wù)的通訊庫(kù)如果設(shè)計(jì)成這種方式,則會(huì)為編程帶來很多困難。
在一個(gè)復(fù)雜系統(tǒng)中,多線程技術(shù)會(huì)被廣泛采用。顯然,上面的循環(huán)遇到某個(gè)消息就處理某個(gè)消息,屬于單線程的工作模式。如何使得上面的程序適合多線程處理呢?可以考慮使用信號(hào)燈。我們將上面接收數(shù)據(jù)的線程成為接收線程,使用數(shù)據(jù)的線程為工作線程。首先工作線程在信號(hào)燈上睡眠等待數(shù)據(jù),接收線程收到數(shù)據(jù)后將數(shù)據(jù)掛入工作線程消息隊(duì)列,然后喚醒工作線程。到目前為止,我們已經(jīng)可以發(fā)現(xiàn) 第一個(gè)問題 了:系統(tǒng)中需要維護(hù)若干信號(hào)燈和若干消息隊(duì)列。這些工作必須由通信庫(kù)使用者來維護(hù)。隨著通信庫(kù)的用戶量越來越大,用戶的維護(hù)開銷也會(huì)越來越大。
關(guān)于第一個(gè)問題,也許還可以茍且忍受。但是,接下來的 第二個(gè)問題 會(huì)讓問題更加復(fù)雜。考慮這樣一種場(chǎng)景:type1和type2兩種消息具有依賴關(guān)系,而某個(gè)功能的實(shí)現(xiàn)需要先接收到type1消息,然后接收到type2消息。我們可以讓實(shí)現(xiàn)次功能的工作線程依次等待兩個(gè)信號(hào)燈即可。但是,如果系統(tǒng)中還存在第三個(gè)線程,它也需要使用type1消息呢?此時(shí)單一的信號(hào)燈已經(jīng)不能解決問題了!當(dāng)type1消息到達(dá)時(shí),type1消息隊(duì)列上的信號(hào)燈是喚醒原來的工作線程呢還是喚醒第三個(gè)線程?這個(gè)問題不解決,要么會(huì)丟包,要么會(huì)讓代碼內(nèi)部邏輯混亂。那么,有補(bǔ)救辦法嗎?有!在上面的消息接收線程中進(jìn)一步細(xì)分消息類型,比如,將type1細(xì)分成type1_for_thread_work, type1_for_thread_third。此時(shí),接收線程趨向于混雜。一旦系統(tǒng)中類似情況很多的時(shí)候,無論是效率還是代碼可維護(hù)性,都會(huì)受到極大挑戰(zhàn)。
解決上面問題的方法有2種:
1、互斥、阻塞地收發(fā)數(shù)據(jù)包
2、采用多端口,不同的while(1){}針對(duì)不同的端口。上層應(yīng)用通過使用不同的端口來避免消息混雜。
下圖描述了單一端口發(fā)存在的問題,以及多端口的優(yōu)勢(shì)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
