


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼前言
實(shí)現(xiàn)消息隊(duì)列的關(guān)鍵因素是考量不同線程訪問消息隊(duì)列的同步問題。本實(shí)現(xiàn)涉及到幾個(gè)知識(shí)點(diǎn)
std::lock_guard介紹
std::lock_gurad是C++11中定義的模板類。定義如下:
templateclassMutexclasslock_guard;
lock_guard對(duì)象通常用于管理某個(gè)鎖(Lock)對(duì)象,因此與MutexRAII相關(guān),方便線程對(duì)互斥量上鎖,即在某個(gè)lock_guard對(duì)象的聲明周期內(nèi),它所管理的鎖對(duì)象會(huì)一直保持上鎖狀態(tài);而lock_guard的生命周期結(jié)束之后,它所管理的鎖對(duì)象會(huì)被解鎖(注:類似shared_ptr等智能指針管理動(dòng)態(tài)分配的內(nèi)存資源)。
模板參數(shù)Mutex代表互斥量類型,例如std::mutex類型,它應(yīng)該是一個(gè)基本的BasicLockable類型,標(biāo)準(zhǔn)庫(kù)中定義幾種基本的BasicLockable類型,分別std::mutex,std::recursive_mutex,std::timed_mutex,std::recursive_timed_mutex以及std::unique_lock
std::unique_lock介紹
lock_guard最大的缺點(diǎn)也是簡(jiǎn)單,沒有給程序員提供足夠的靈活度,因此,C++11標(biāo)準(zhǔn)中定義了另外一個(gè)與MutexRAII相關(guān)類unique_lock,該類與lock_guard類相似,也很方便線程對(duì)互斥量上鎖,但它提供了更好的上鎖和解鎖控制。
顧名思義,unique_lock對(duì)象以獨(dú)占所有權(quán)的方式(uniqueowership)管理mutex對(duì)象的上鎖和解鎖操作,所謂獨(dú)占所有權(quán),就是沒有其他的unique_lock對(duì)象同時(shí)擁有某個(gè)mutex對(duì)象的所有權(quán)。
新創(chuàng)建的unique_lock對(duì)象管理Mutex對(duì)象m,并嘗試調(diào)用m.lock()對(duì)Mutex對(duì)象進(jìn)行上鎖,如果此時(shí)另外某個(gè)unique_lock對(duì)象已經(jīng)管理了該Mutex對(duì)象m,則當(dāng)前線程將會(huì)被阻塞。
std::condition介紹
當(dāng)std::condition_variable對(duì)象的某個(gè)wait函數(shù)被調(diào)用的時(shí)候,它使用std::unique_lock(通過std::mutex)來(lái)鎖住當(dāng)前線程。當(dāng)前線程會(huì)一直被阻塞,直到另外一個(gè)線程在相同的std::condition_variable對(duì)象上調(diào)用了notification函數(shù)來(lái)喚醒當(dāng)前線程。
std::condition_variable提供了兩種wait()函數(shù)。當(dāng)前線程調(diào)用wait()后將被阻塞(此時(shí)當(dāng)前線程應(yīng)該獲得了鎖(mutex),不妨設(shè)獲得鎖lck),直到另外某個(gè)線程調(diào)用notify_*喚醒了當(dāng)前線程。
在線程被阻塞時(shí),該函數(shù)會(huì)自動(dòng)調(diào)用lck.unlock()釋放鎖,使得其他被阻塞在鎖競(jìng)爭(zhēng)上的線程得以繼續(xù)執(zhí)行。另外,一旦當(dāng)前線程獲得通知(notified,通常是另外某個(gè)線程調(diào)用notify_*喚醒了當(dāng)前線程),wait()函數(shù)也是自動(dòng)調(diào)用lck.lock(),使得lck的狀態(tài)和wait函數(shù)被調(diào)用時(shí)相同。
在第二種情況下(即設(shè)置了Predicate),只有當(dāng)pred條件為false時(shí)調(diào)用wait()才會(huì)阻塞當(dāng)前線程,并且在收到其他線程的通知后只有當(dāng)pred為true時(shí)才會(huì)被解除阻塞。因此第二種情況類似以下代碼:
while(!pred())wait(lck);
std::function介紹
使用std::function可以將普通函數(shù),lambda表達(dá)式和函數(shù)對(duì)象類統(tǒng)一起來(lái)。它們并不是相同的類型,然而通過function模板類,可以轉(zhuǎn)化為相同類型的對(duì)象(function對(duì)象),從而放入一個(gè)vector或其他容器里,方便回調(diào)。
代碼實(shí)現(xiàn):
#pragmaonce
#ifndefMESSAGE_QUEUE_H
#defineMESSAGE_QUEUE_H
#includequeue
#includemutex
#includecondition_variable
templateclassType
classCMessageQueue
public:
CMes
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 包獵頭公司管理制度
- 2025年考前沖刺的系統(tǒng)分析師考試試題及答案
- 混凝土現(xiàn)場(chǎng)管理制度
- 施工倉(cāng)庫(kù)退貨管理制度
- 弱電維修人員管理制度
- 水壺生產(chǎn)品質(zhì)管理制度
- 政府采購(gòu)公司管理制度
- 充電場(chǎng)站管理制度
- 教室衛(wèi)生安全管理制度
- 企業(yè)報(bào)價(jià)管理制度
- 食堂食材配送采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 抗量子密碼技術(shù)與應(yīng)用白皮書
- 低空經(jīng)濟(jì)產(chǎn)業(yè)園商業(yè)計(jì)劃
- 2024年陜西省中考化學(xué)試卷真題(含答案)
- 基礎(chǔ)有機(jī)化學(xué)實(shí)驗(yàn)智慧樹知到期末考試答案章節(jié)答案2024年浙江大學(xué)
- 2024重度哮喘診斷與處理中國(guó)專家共識(shí)解讀課件
- (高清版)JCT 864-2008 聚合物乳液建筑防水涂料
- 老年專科護(hù)理考試試題
- 語(yǔ)法大全之一般現(xiàn)在時(shí)動(dòng)詞三單變化練習(xí)題-(答案)
- 建筑保溫工程包工包料合同協(xié)議書范本
- 中醫(yī)病歷書寫基本規(guī)范
評(píng)論
0/150
提交評(píng)論