日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
探究Linux讀寫鎖的遞歸特性(linux讀寫鎖遞歸)

1. 前言

讀寫鎖是Linux內(nèi)核中一個非常重要的同步機制。在多線程編程中,通過加鎖保證共享資源的同步訪問能夠滿足線程之間的并發(fā)需求。讀寫鎖作為一種特殊的鎖機制,既能滿足讀多寫少的場景,也能保證讀鎖與寫鎖之間的互斥,從而防止數(shù)據(jù)的競爭和錯誤。

本文旨在探討Linux讀寫鎖的遞歸特性,深入分析在同一線程內(nèi)部對于讀寫鎖的多次加鎖和解鎖操作,探討它們之間的關(guān)聯(lián)性,為讀寫鎖的更深入理解提供幫助。

2. 讀寫鎖的簡介

在深入討論讀寫鎖的遞歸特性之前,我們有必要先簡要了解讀寫鎖的基本概念。

讀寫鎖是一種特殊的線程同步機制,可以分為讀鎖和寫鎖兩個狀態(tài)。當一個線程擁有了讀鎖,其他線程可以繼續(xù)獲取讀鎖,但是不能獲取寫鎖。而當一個線程擁有了寫鎖,其他線程則不能獲取讀鎖或?qū)戞i。

在讀寫鎖之下,讀操作和寫操作之間并不沖突,因此多個線程可以同時獲取讀鎖,但只有一個線程可以獲取寫鎖。多個線程之間用讀鎖讀取共享數(shù)據(jù),并沒有互相之間的干擾,只有當出現(xiàn)寫操作時,多個線程之間才需要排他性地互斥訪問共享數(shù)據(jù)。

同時,讀寫鎖相對于普通的互斥鎖,具有一個非常重要的優(yōu)勢:讀寫鎖支持并發(fā)讀取,而互斥鎖則需要線程依次排隊,效率會受到嚴重影響。

3. 遞歸的概念

遞歸是指在一個函數(shù)內(nèi)部調(diào)用自身的一種技術(shù)。也就是說,在程序代碼中反復地調(diào)用自己的過程,直到處理完特定的任務(wù)。遞歸調(diào)用是一種重要的算法設(shè)計技術(shù),在許多算法和數(shù)據(jù)結(jié)構(gòu)中都有應(yīng)用。

在遞歸調(diào)用過程中,每次調(diào)用會產(chǎn)生一個新的函數(shù)局部變量和一個新的函數(shù)執(zhí)行環(huán)境。這個新的變量和環(huán)境必須要保證獨立于調(diào)用該函數(shù)的其他環(huán)境。遞歸函數(shù)必須有合理的條件來終止遞歸的過程,否則程序會死循環(huán)。

諸如“stack overflow”的錯誤提示,就是因為遞歸的調(diào)用鏈太長,導致??臻g耗盡,程序在終止整個遞歸過程之前先拋出異常。

4. 讀寫鎖的遞歸特性

Linux內(nèi)核提供的讀寫鎖,不僅支持普通的讀鎖和寫鎖之間的互斥操作,同時還支持鎖的遞歸。也就是說,在同一線程中,可以重復地獲取讀鎖或?qū)戞i,而不會造成死鎖或其他不可預(yù)期的錯誤。當然,這種遞歸特性是有條件的,需要滿足以下兩個條件:

– 重復獲取讀鎖或?qū)戞i的次數(shù)不能超過內(nèi)核設(shè)置的極限值(通常為8次)。

– 內(nèi)部加鎖和解鎖操作必須是完全匹配的,即獲取鎖的次數(shù)等于釋放鎖的次數(shù)。

在實際編寫程序代碼時,使用讀寫鎖的遞歸特性需要非常小心,因為不正確的使用會導致死鎖或其他難以排查的錯誤。在同一線程內(nèi)重復加鎖或解鎖操作時,必須要非常仔細地考慮每一次操作所產(chǎn)生的副作用,確保每次操作都是符合邏輯的。

5. 遞歸特性的實現(xiàn)

在Linux內(nèi)核中,讀寫鎖的遞歸特性主要是通過一系列的內(nèi)部狀態(tài)和機制來實現(xiàn)的。具體來說,內(nèi)核必須要記錄下每個讀寫鎖被哪些線程所持有,并實現(xiàn)不同線程之間鎖的互斥操作。

為此,Linux內(nèi)核使用了如下的實現(xiàn)機制:

– 通過spinlock_t類型的lock變量來實現(xiàn)鎖的互斥保護。

– 通過讀寫鎖的狀態(tài)來區(qū)分讀鎖和寫鎖,同時記錄當前鎖被持有的次數(shù)。

– 通過wt_queue_head_t類型的隊列來管理等待鎖的線程,確保鎖的有序釋放和喚醒過程。

– 通過rcu_read_lock和rcu_read_unlock來實現(xiàn)讀寫鎖的遞歸互斥操作(rcu_read_lock和rcu_read_unlock的實現(xiàn)工作原理與讀寫鎖的遞歸原理類似)。

讀寫鎖的遞歸特性通過上述機制的組合和配合,使得程序能夠正確地管理鎖的狀態(tài),保證了讀寫鎖的內(nèi)部遞歸互斥和外部競爭控制。

6. 遞歸特性的應(yīng)用

在使用讀寫鎖的時候,遞歸特性往往是一個非常有用的輔助工具。在某些特殊的情況下,適當?shù)厥褂眠f歸調(diào)用可以幫助程序更好地管理鎖的狀態(tài)和訪問共享資源。

舉個例子,假設(shè)我們有一個多線程的任務(wù)管理器,每個任務(wù)都有自己的狀態(tài)和一些共享的信息。當不同線程需要同時訪問同一個任務(wù)的時候,就需要對任務(wù)對象進行讀鎖或?qū)戞i的加鎖操作,確保線程之間的同步訪問。

但是,在某些特殊的情況下,可能會出現(xiàn)一個線程重復調(diào)用同一個任務(wù)的情況,如果不使用遞歸鎖,在某些情況下會導致死鎖,影響程序的穩(wěn)定性和正確性。

通過使用遞歸鎖,就可以在同一線程內(nèi)重復加鎖和解鎖,而又不會影響其他線程的訪問。這樣就可以保證任務(wù)對象的訪問過程是安全的、有序的,避免了線程之間的沖突和錯誤。

7.

在本文中,我們探究了Linux讀寫鎖的遞歸特性,深入分析了在同一線程內(nèi)對于讀寫鎖的多次加鎖和解鎖操作,以及它們之間的關(guān)聯(lián)性。同時我們還介紹了讀寫鎖的基本概念、遞歸的概念,以及遞歸特性的實現(xiàn)和應(yīng)用。

讀寫鎖是一種非常重要的同步機制,具有良好的并發(fā)性和穩(wěn)定性。我們可以利用它在多線程程序中進行資源的共享和競爭控制,提升程序的性能和可靠性。同時,遞歸鎖也是一個非常有用的輔助工具,可以幫助我們更好地管理鎖的狀態(tài)和訪問共享資源。

相關(guān)問題拓展閱讀:

  • Linux C++多線程同步的四種方式
  • 如何在Linux下遞歸查看所有文件或目錄

Linux C++多線程同步的四種方式

From :

1.同一個線程內(nèi)部,指令按照先后順序執(zhí)行;但不同線程之間的指令很難說清楚是哪一個先執(zhí)行,在并況下,指令執(zhí)行的先后順序由內(nèi)核決定。

如果運行的結(jié)果依賴于不同線程執(zhí)行的先后的話,那么就會形成競爭條件,在這樣的情況下,計算的結(jié)果很難預(yù)知,所以應(yīng)該盡量避免競爭條件的形成。

2.最常見的解決競爭條件的方法是:將原先分離的兩個指令構(gòu)成一個不可分割的原子操作,而其他任務(wù)不能插入到原子操作中!

3.對

多線程

來說,同步指的是在一定時間內(nèi)只允許某一個線程訪問某個資源,而在此時間內(nèi),不允許其他線程訪問該資源!

互斥鎖

條件變量

讀寫鎖

信號量

一種特殊的

全局變量

,擁有l(wèi)ock和unlock兩種狀態(tài)。

unlock的互斥鎖可以由某個線程獲得,一旦獲得,這個互斥鎖會鎖上變成lock狀態(tài),此后只有該線程由權(quán)力打開該鎖,其他線程想要獲得互斥鎖,必須得到互斥鎖再次被打開之后。

1.互斥鎖的初始化, 分為靜態(tài)初始化和動態(tài)初始化.

2.互斥鎖的相關(guān)屬性及分類

(1) attr表示互斥鎖的屬性;

(2) pshared表示互斥鎖的共享屬性,由兩種取值:

1)PTHREAD_PROCESS_PRIVATE:鎖只能用于一個進程內(nèi)部的兩個線程進行互斥(默認情況)

2)PTHREAD_PROCESS_SHARED:鎖可用于兩個不同進程中的線程進行互斥,使用時還需要在進程共享內(nèi)存中分配互斥鎖,然后為該互斥鎖指定屬性就可以了。

互斥鎖存在缺點:

(1)某個線程正在等待共享數(shù)據(jù)內(nèi)某個條件出現(xiàn)。

(2)重復對數(shù)據(jù)對象加鎖和解鎖(輪詢),但是這樣輪詢非常耗費時間和資源,而且效率非常低,所以互斥鎖不太適合這種情況。

當線程在等待滿足某些條件時,使線程進入睡眠狀態(tài);一旦條件滿足,就換線因等待滿足特定條件而睡眠的線程。

程序的效率無疑會大大提高。

1)創(chuàng)建

靜態(tài)方式:pthread_cond_t cond PTHREAD_COND_INITIALIZER

動態(tài)方式:int pthread_cond_init(&cond,NULL)

Linux thread 實現(xiàn)的條件變量不支持屬性,所以NULL(cond_attr參數(shù))

2)注銷

int pthread_cond_destory(&cond)

只有沒有線程在該條件變量上,該條件變量才能注饑畝銷,否則返回EBUSY

因為Linux實現(xiàn)的條件變量沒有分配什么資源,所以注銷動作只包括檢查是否姿肢改有等待線程!(請參考條件變量的底層實現(xiàn))

3)等待

條件等待:int pthread_cond_wait(&cond,&mutex)

計時等待:int pthread_cond_timewait(&cond,&mutex,time)

1.其中計時等待如果在給定時刻前條件沒有被滿足,則返回ETIMEOUT,結(jié)束等待

2.無論那種等待方式,都必須有一個互斥鎖配合,以防止多個線程同時請求pthread_cond_wait形成競爭條件!

3.在調(diào)用pthread_cond_wait前必須由本線程加鎖

4)激發(fā)

激發(fā)一個等待線程:pthread_cond_signal(&cond)

激發(fā)所有等待線程:pthread_cond_broadcast(&cond)

重要的是,pthread_cond_signal不會存在驚群效應(yīng),也就是是它最多給一個等待線程發(fā)信號,不會給所有線程發(fā)信號喚醒,然后要求他們自己去爭搶資源!

pthread_cond_broadcast() 喚醒所有正在pthread_cond_wait()的同一個條件變量的線程。注意:如果等待的多個現(xiàn)場不使用同一個鎖,被喚跡判醒的多個線程執(zhí)行是并發(fā)的。

pthread_cond_broadcast & pthread_cond_signal

1.讀寫鎖比互斥鎖更加具有適用性和并行性

2.讀寫鎖最適用于對

數(shù)據(jù)結(jié)構(gòu)

的讀操作讀操作次數(shù)多余寫操作次數(shù)的場合!

3.鎖處于讀模式時可以線程共享,而鎖處于寫模式時只能獨占,所以讀寫鎖又叫做共享-獨占鎖。

4.讀寫鎖有兩種策略:強讀同步和強寫同步

強讀同步:

總是給讀者更高的優(yōu)先權(quán),只要寫者沒有進行寫操作,讀者就可以獲得訪問權(quán)限

強寫同步:

總是給寫者更高的優(yōu)先權(quán),讀者只能等到所有正在等待或者執(zhí)行的寫者完成后才能進行讀

1)初始化的銷毀讀寫鎖

靜態(tài)初始化:pthread_rwlock_t rwlock=PTHREAD_RWLOCK_INITIALIZER

動態(tài)初始化:int pthread_rwlock_init(rwlock,NULL),NULL代表讀寫鎖采用默認屬性

銷毀讀寫鎖:int pthread_rwlock_destory(rwlock)

在釋放某個讀寫鎖的資源之前,需要先通過pthread_rwlock_destory函數(shù)對讀寫鎖進行清理。釋放由pthread_rwlock_init函數(shù)分配的資源

如果你想要讀寫鎖使用非默認屬性,則attr不能為NULL,得給attr賦值

int pthread_rwlockattr_init(attr),給attr初始化

int pthread_rwlockattr_destory(attr),銷毀attr

2)以寫的方式獲取鎖,以讀的方式獲取鎖,釋放讀寫鎖

int pthread_rwlock_rdlock(rwlock),以讀的方式獲取鎖

int pthread_rwlock_wrlock(rwlock),以寫的方式獲取鎖

int pthread_rwlock_unlock(rwlock),釋放鎖

上面兩個獲取鎖的方式都是阻塞的函數(shù),也就是說獲取不到鎖的話,調(diào)用線程不是立即返回,而是阻塞執(zhí)行,在需要進行寫操作的時候,這種阻塞式獲取鎖的方式是非常不好的,你想一下,我需要進行寫操作,不但沒有獲取到鎖,我還一直在這里等待,大大拖累效率

所以我們應(yīng)該采用非阻塞的方式獲取鎖:

int pthread_rwlock_tryrdlock(rwlock)

int pthread_rwlock_trywrlock(rwlock)

互斥鎖只允許一個線程進入臨界區(qū),而信號量允許多個線程進入臨界區(qū)。

1)信號量初始化

int sem_init(&sem,pshared, v)

pshared為0,表示這個信號量是當前進程的局部信號量。

pshared為1,表示這個信號量可以在多個進程之間共享。

v為信號量的初始值。

返回值

成功:0,失?。?1

2)信號量值的加減

int sem_wait(&sem):以原子操作的方式將信號量的值減去1

int sem_post(&sem):以原子操作的方式將信號量的值加上1

3)對信號量進行清理

int sem_destory(&sem)

如何在Linux下遞歸查看所有文件或目錄

使用find命令就可以了擾胡

find . -print

就是從緩困攔當前尺茄目錄往下遞歸的查看所有的文件和文件夾

linux 讀寫鎖遞歸的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux 讀寫鎖遞歸,探究Linux讀寫鎖的遞歸特性,Linux C++多線程同步的四種方式,如何在Linux下遞歸查看所有文件或目錄的信息別忘了在本站進行查找喔。

成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機房服務(wù)器托管/機柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機房租用、服務(wù)器托管、機柜租賃、大帶寬租用,可選線路電信、移動、聯(lián)通等。


分享標題:探究Linux讀寫鎖的遞歸特性(linux讀寫鎖遞歸)
網(wǎng)站路徑:http://www.dlmjj.cn/article/djohose.html