線程同步機(jī)制深入分析

線程同步機(jī)制深入分析

ID:27807135

大?。?66.48 KB

頁(yè)數(shù):16頁(yè)

時(shí)間:2018-12-06

線程同步機(jī)制深入分析_第1頁(yè)
線程同步機(jī)制深入分析_第2頁(yè)
線程同步機(jī)制深入分析_第3頁(yè)
線程同步機(jī)制深入分析_第4頁(yè)
線程同步機(jī)制深入分析_第5頁(yè)
資源描述:

《線程同步機(jī)制深入分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)

1、線程同步之利器⑴——可遞歸鎖與非遞歸鎖概述最常見的進(jìn)程/線程的同步方法有互斥鎖(或稱互斥量Mutex),讀寫鎖(rdlock),條件變量(cond),信號(hào)量(Semophore)等。在Windows系統(tǒng)中,臨界區(qū)(CriticalSection)和事件對(duì)象(Event)也是常用的同步方法。簡(jiǎn)單的說,互斥鎖保護(hù)了一個(gè)臨界區(qū),在這個(gè)臨界區(qū)中,一次最多只能進(jìn)入一個(gè)線程。如果有多個(gè)進(jìn)程在同一個(gè)臨界區(qū)內(nèi)活動(dòng),就有可能產(chǎn)生競(jìng)態(tài)條件(racecondition)導(dǎo)致錯(cuò)誤。讀寫鎖從廣義的邏輯上講,也可以認(rèn)為是一種共享版的互斥鎖。如果對(duì)一個(gè)臨界區(qū)大部分是讀操作而只有

2、少量的寫操作,讀寫鎖在一定程度上能夠降低線程互斥產(chǎn)牛的代價(jià)。條件變量允許線程以一種無競(jìng)爭(zhēng)的方式等待某個(gè)條件的發(fā)生。當(dāng)該條件沒有發(fā)生時(shí),線程會(huì)一直處于休眠狀態(tài)。當(dāng)被其它線程通知條件已經(jīng)發(fā)生時(shí),線程才會(huì)被喚醒從而繼續(xù)向下執(zhí)行。條件變量是比較底層的同步原語(yǔ),直接使用的情況不多,往往用于實(shí)現(xiàn)高層之間的線程同步。使用條件變量的一個(gè)經(jīng)典的例子就是線程池(ThreadPool)To在學(xué)習(xí)操作系統(tǒng)的進(jìn)程同步原理時(shí),講的最多的就是信號(hào)量了。通過精心設(shè)計(jì)信號(hào)量的PV操作,可以實(shí)現(xiàn)很復(fù)雜的進(jìn)程同步情況(例如經(jīng)典的哲學(xué)家就餐問題和理發(fā)店問題)。而現(xiàn)實(shí)的程序設(shè)計(jì)中,卻極少有

3、人使用信號(hào)量。能用信號(hào)量解決的問題似乎總能用其它更清晰更簡(jiǎn)潔的設(shè)計(jì)手段去代替信號(hào)量。本系列文章的目的并不是為了講解這些同步方法應(yīng)該如何使用(AUPE的書已經(jīng)足夠清楚了)。更多的是講解很容易被人忽略的一些關(guān)于鎖的概念,以及比較經(jīng)典的使用與設(shè)計(jì)方法。文章會(huì)涉及到遞歸鎖與非遞歸鎖(recursivemutex和non-recursivemutex),區(qū)域鎖(ScopedLock),策略鎖(StrategizedLocking),讀寫鎖與條件變量,雙重檢測(cè)鎖(DCL),鎖無關(guān)的數(shù)據(jù)結(jié)構(gòu)(Lockingfree),自旋鎖等等內(nèi)容,希望能夠拋磚引玉。那么我們就

4、先從遞歸鎖與非遞歸鎖說開去吧:)1可遞歸鎖與非遞歸鎖1.1概念在所有的線程同步方法中,恐怕互斥鎖(mutex)的出場(chǎng)率遠(yuǎn)遠(yuǎn)高于其它方法?;コ怄i的理解和基木使用方法都很容易,這里不做更多介紹ToMutex可以分為遞婦鮑recursivemutex)^^^/^^(non-recursivemutex)o可遞歸鎖也可稱為可童人埶reentrantmutex),非遞歸鎖又叫不可重入鎖goo-reentrantmutex)o二者唯一的區(qū)別是,同一個(gè)線程可以多次獲取同一個(gè)遞歸鎖,不會(huì)產(chǎn)生死鎖。而如果一個(gè)線程多次獲取同一個(gè)非遞歸鎖,則會(huì)產(chǎn)生死鎖。Windows下

5、的Mutex和CriticalSection是可遞歸的。Linux下的pthread_mutex_t鎖默認(rèn)是非遞歸的??梢燥@示的設(shè)置PTHREADMUTEXRECURSIVE屬性,Wpthreadmutext設(shè)為遞歸鎖。在大部分介紹如何使用互斥量的文章和書中,這兩個(gè)概念常常被忽略或者輕描淡寫,造成很多人壓根就不知道這個(gè)概念。但是如果將這兩種鎖誤用,很可能會(huì)造成程序的死鎖。請(qǐng)看下面的程序。1MutexLockmutex;22voidfoo()3{mutex.lock();//dosomething7mutex.uniock();8}91()voidb

6、ar()11{12mutex.lock();13//dosomething141=00();15mutex.unlock();16}foo函數(shù)和bar函數(shù)都獲取了同一個(gè)鎖,而bar函數(shù)又會(huì)調(diào)用foo函數(shù)。如果MutexLock鎖是個(gè)非遞歸鎖,則這個(gè)程序會(huì)立即死鎖。因此在為一段程序加鎖時(shí)要格外小心,否則很容易因?yàn)檫@種調(diào)用關(guān)系而造成死鎖。不要存在僥幸心理,覺得這種情況是很少岀現(xiàn)的。當(dāng)代碼復(fù)雜到一定程度,被多個(gè)人維護(hù),調(diào)用關(guān)系錯(cuò)綜復(fù)雜時(shí),程序中很容易犯這樣的錯(cuò)誤。慶幸的是,這種原因造成的死鎖很容易被排除。但是這并不意味著應(yīng)該用遞歸鎖去代替非遞歸鎖。遞歸鎖

7、用起來固然簡(jiǎn)單,但往往會(huì)隱藏某些代碼問題。比如調(diào)用函數(shù)和被調(diào)用函數(shù)以為自己拿到了鎖,都在修改同一個(gè)對(duì)象,這時(shí)就很容易岀現(xiàn)問題。因此在能使用非遞歸鎖的情況下,應(yīng)該盡量使用非遞歸鎖,因?yàn)樗梨i相對(duì)來說,更容易通過調(diào)試發(fā)現(xiàn)。程序設(shè)計(jì)如果有問題,應(yīng)該暴露的越早越好。1.2如何避免為了避免上述情況造成的死鎖,AUPEV2—書在第12章提出了一種設(shè)計(jì)方法。即如果一個(gè)函數(shù)既有可能在已加鎖的情況下使用,也有可能在未加鎖的情況下使用,往往將這個(gè)函數(shù)拆成兩個(gè)版本…加鎖版本和不加鎖版本(添加nolock后綴)。例如將foo()函數(shù)拆成兩個(gè)函數(shù)。17//不加鎖版本18voi

8、dfoo_nolock()19{2()//dosomething21}22//加鎖版本23voidfun()24{25mu

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。