C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼_第1頁(yè)
C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼_第2頁(yè)
C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論