


下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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)鍵因素是考量不同線程訪問(wèn)消息隊(duì)列的同步問(wèn)題。本實(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)單,沒(méi)有給程序員提供足夠的靈活度,因此,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),就是沒(méi)有其他的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(通過(guò)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)。它們并不是相同的類型,然而通過(guò)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ú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政法規(guī)實(shí)施中的公眾參與試題及答案
- 心血管藥物應(yīng)用分析試題及答案2025年
- 2025年執(zhí)業(yè)醫(yī)師考試知識(shí)要求及試題及答案
- 2025年執(zhí)業(yè)醫(yī)師考試解題思路分享與試題及答案
- 2025年護(hù)士職業(yè)道德覺(jué)悟試題及答案
- 自考行政管理趨勢(shì)研究試題及答案
- 行政管理外部環(huán)境分析試題及答案2025年
- 藥品申報(bào)程序與法規(guī)試題及答案
- 大學(xué)語(yǔ)文考試的思辨能力試題及答案
- 主管護(hù)師孵化新思維試題及答案
- 給排水工程畢業(yè)設(shè)計(jì)論文-高層住宅給排水設(shè)計(jì)
- 房屋改造合同2024年
- JGJ-T221-2010纖維混凝土應(yīng)用技術(shù)規(guī)程
- 連棟簡(jiǎn)易溫室結(jié)構(gòu)計(jì)算書
- 正餐服務(wù)業(yè)連鎖經(jīng)營(yíng)模式研究
- 【正版授權(quán)】 ISO 10993-18:2020/Amd 1:2022 EN Biological evaluation of medical devices - Part 18: Chemical characterization of medical device materials within a risk management process -
- 不忠的婚姻協(xié)議
- 2024屆上海奉賢區(qū)高三一模英語(yǔ)試題及答案
- 2024山東鐵投集團(tuán)招聘筆試沖刺題(帶答案解析)
- 環(huán)境與資源保護(hù)法學(xué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年湖南師范大學(xué)
- (高清版)JTGT 3222-2020 公路工程物探規(guī)程
評(píng)論
0/150
提交評(píng)論