最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中讀寫(xiě)鎖的簡(jiǎn)單實(shí)現(xiàn)方法實(shí)例

 更新時(shí)間:2021年11月03日 09:22:20   作者:頭疼腦脹的代碼搬運(yùn)工  
讀寫(xiě)鎖是計(jì)算機(jī)程序的并發(fā)控制的一種同步機(jī)制,也稱“共享-互斥鎖”、多讀者-單寫(xiě)者鎖,讀操作可并發(fā)重入,寫(xiě)操作是互斥的,這篇文章主要給大家介紹了關(guān)于iOS中讀寫(xiě)鎖的簡(jiǎn)單實(shí)現(xiàn)方法,需要的朋友可以參考下

廢話開(kāi)篇

iOS 下的多線程的技術(shù)的應(yīng)用衍生出了鎖的機(jī)制,試想,如果 iOS 下沒(méi)有多線程的概念,所有的代碼都會(huì)在同步環(huán)境下執(zhí)行,那么,也就不會(huì)產(chǎn)生爭(zhēng)奪資源情況的發(fā)生,當(dāng)然,也就沒(méi)有辦法利用多核的優(yōu)勢(shì)。所以,多線程的應(yīng)用是廣布的,而鎖的應(yīng)用是局部的,所以,二者應(yīng)相輔相成,來(lái)達(dá)到提高運(yùn)行效率的同時(shí)提高程序運(yùn)行的穩(wěn)定性。

思考一、對(duì)于鎖的類型的理解

基本的三種鎖的類型:互斥鎖、自旋鎖、讀寫(xiě)鎖。

其中,互斥鎖 多線程在訪問(wèn)加鎖中的臨界區(qū)前,會(huì)進(jìn)入休眠,一直等待解鎖后系統(tǒng)調(diào)度
;自旋鎖 多線程在訪問(wèn)加鎖中的臨界區(qū)前,不進(jìn)入休眠,會(huì)一直忙等。 讀寫(xiě)鎖 是一種思想,本質(zhì)就是利用 互斥鎖 來(lái)實(shí)現(xiàn)特定的應(yīng)用場(chǎng)景:多讀并行、讀與寫(xiě)互斥,寫(xiě)與寫(xiě)互斥;對(duì)于其他的類型的鎖,比如:信號(hào)量、條件鎖、遞歸鎖,可以理解為是由以上基本類型的鎖實(shí)現(xiàn)的上層封裝。

思考二、讀寫(xiě)鎖的實(shí)現(xiàn)邏輯

如果有這樣一塊公共資源,它的寫(xiě)入是比較耗時(shí),那么,在這段時(shí)間內(nèi)要避免程序再次的進(jìn)行寫(xiě)入操作和讀取操作,這樣可以避免產(chǎn)生爭(zhēng)奪資源的問(wèn)題,當(dāng)然,讀取的過(guò)程可以并行。

先上一段代碼,這里模擬一個(gè)比較耗時(shí)的寫(xiě)入過(guò)程,在模擬一個(gè)快速讀取的過(guò)程。

//讀寫(xiě)鎖
- (void)readAndWriteLock
{
    //寫(xiě)
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"我開(kāi)始寫(xiě)");
            for (int i = 0; i < 10000; i++) {
            }
            NSLog(@"我寫(xiě)完了");

    });

    //讀
    for (int i = 0; i < 10; i++) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"我開(kāi)始讀%d",i);
            for (int j = 0; j < i; j++) {
            }
            NSLog(@"我讀完了%d",i);
        });
    }
}

在寫(xiě)入的異步內(nèi)執(zhí)行了循環(huán) 10000 次的操作來(lái)模擬耗時(shí)任務(wù);后面開(kāi)辟了多線程進(jìn)行讀取,在讀取的異步里,實(shí)現(xiàn)簡(jiǎn)單的不同數(shù)量的循環(huán)來(lái)模擬耗時(shí)任務(wù),這里的耗時(shí)次數(shù)遠(yuǎn)小于寫(xiě)入。

打印如下

通過(guò)輸出可以清晰的看到,寫(xiě)入過(guò)程中還有很多讀取的操作在同時(shí)進(jìn)行。致于是先開(kāi)始讀取還是開(kāi)始寫(xiě)入,這里其實(shí)并不用去關(guān)心,本身它們也是由系統(tǒng)決定的,但是,這里需要控制一下代碼,來(lái)實(shí)現(xiàn)讀寫(xiě)互斥,即在寫(xiě)的過(guò)程中,禁止讀取操作的介入。同時(shí),也需要實(shí)現(xiàn)寫(xiě)寫(xiě)互斥。對(duì)于,多讀,其實(shí)這里并不需要過(guò)多干涉,因?yàn)?,本身就允許多讀的邏輯。

思考三、簡(jiǎn)單封裝讀寫(xiě)鎖,滿足讀寫(xiě)邏輯

利用互斥鎖封裝讀取加、解鎖;寫(xiě)入加、解鎖

//初始化讀取鎖
static pthread_mutex_t r_plock =  PTHREAD_MUTEX_INITIALIZER;
//初始化寫(xiě)入鎖
static pthread_mutex_t w_plock =  PTHREAD_MUTEX_INITIALIZER;
//記錄當(dāng)前讀取次數(shù),因?yàn)橹灰渲挡粸?,那么,就說(shuō)明程序在讀取操作,這里停止寫(xiě)入操作
static int current_read_times = 0;

進(jìn)行讀取加鎖

//讀加鎖
- (void)readLock
{
    pthread_mutex_lock(&r_plock);
    current_read_times ++;
    if (current_read_times == 1) {
        pthread_mutex_lock(&w_plock);
    }
    pthread_mutex_unlock(&r_plock);
}

這里首先進(jìn)行 讀取鎖 加鎖,這里加鎖的目的并不是鎖定讀取過(guò)程,而是鎖定了修改 current_read_times 的過(guò)程,當(dāng) current_read_times 變更后,如果為 1,那么,就對(duì) 寫(xiě)入鎖 加鎖,這個(gè)寫(xiě)入鎖就是鎖住寫(xiě)入過(guò)程的。這兩個(gè)鎖的應(yīng)用部分是有區(qū)別的。

進(jìn)行讀取解鎖

//讀解鎖
- (void)readUnLock
{
    pthread_mutex_lock(&r_plock);
    current_read_times --;
    if (current_read_times == 0) {
        pthread_mutex_unlock(&w_plock);
    }
    pthread_mutex_unlock(&r_plock);
}

這里首先進(jìn)行 讀取鎖 加鎖,目的還是對(duì) current_read_times 修改的鎖,可以總結(jié)一下,讀寫(xiě)鎖本質(zhì)并不對(duì)多讀進(jìn)行限制,所以,這里的讀取鎖是鎖住 current_read_times 修改過(guò)程,在加鎖的情況下進(jìn)行 寫(xiě)入鎖 狀態(tài)的變更,實(shí)現(xiàn) 讀與寫(xiě)的互斥。后面進(jìn)行狀態(tài)判斷,如果 current_read_times 為 0,說(shuō)明當(dāng)前所以讀取完成了,那么,對(duì) 寫(xiě)入鎖 進(jìn)行解鎖,解鎖后寫(xiě)入操作就可以正常進(jìn)行。這里解鎖的判斷為 == 0 與 加鎖的判斷 == 1 是一對(duì),這樣就滿足了,一個(gè)加鎖過(guò)程對(duì)應(yīng)一個(gè)解鎖條件。不會(huì)出現(xiàn)只有加鎖后而沒(méi)有解鎖的情況。

進(jìn)行寫(xiě)入加鎖

//寫(xiě)加鎖
- (void)writeLock
{
    pthread_mutex_lock(&w_plock);
}

這里僅僅是對(duì) 寫(xiě)入 操作進(jìn)行加鎖。

進(jìn)行寫(xiě)入解鎖

//寫(xiě)解鎖
- (void)writeUnLock
{
    pthread_mutex_unlock(&w_plock);
}

這里僅僅是對(duì) 寫(xiě)入 操作進(jìn)行解鎖。

最后的代碼

//讀寫(xiě)鎖
- (void)readAndWriteLock
{
    //寫(xiě)
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self writeLock];
            NSLog(@"我開(kāi)始寫(xiě)");
            for (int i = 0; i < 10000; i++) {

            }
            NSLog(@"我寫(xiě)完了");
            [self writeUnLock];
    });
    
    //讀
    for (int i = 0; i < 10; i++) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self readLock];
            NSLog(@"我開(kāi)始讀%d",i);
            for (int j = 0; j < i; j++) {

            }
            NSLog(@"我讀完了%d",i);
            [self readUnLock];
        });
    }
}

打印如下

可以看待寫(xiě)入過(guò)程是完整的一個(gè)打印順序,而讀取過(guò)程由于沒(méi)有鎖的保護(hù)并沒(méi)有按順序執(zhí)行。

一個(gè)簡(jiǎn)單的 讀寫(xiě)鎖 就完成了。代碼拙劣,大神勿笑。

總結(jié)

到此這篇關(guān)于iOS中讀寫(xiě)鎖的簡(jiǎn)單實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)iOS讀寫(xiě)鎖實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 兩種iOS調(diào)用系統(tǒng)發(fā)短信的方法

    兩種iOS調(diào)用系統(tǒng)發(fā)短信的方法

    iOS調(diào)用系統(tǒng)的發(fā)短信功能可以分為兩種:1,程序外調(diào)用系統(tǒng)發(fā)短信。2,程序內(nèi)調(diào)用系統(tǒng)發(fā)短信。第二種的好處是用戶發(fā)短信之后還可以回到app。這對(duì)app來(lái)說(shuō)非常重要。
    2016-07-07
  • WKWebView、WebView和JS的交互方式詳解

    WKWebView、WebView和JS的交互方式詳解

    這篇文章主要給大家介紹了關(guān)于WKWebView、WebView和JS的交互方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Swift 2.1 為 UIView 添加點(diǎn)擊事件和點(diǎn)擊效果

    Swift 2.1 為 UIView 添加點(diǎn)擊事件和點(diǎn)擊效果

    本文主要介紹 Swift UIView,這里給大家提供代碼示例作為參考為UIView 添加點(diǎn)擊事件和點(diǎn)擊效果,希望能幫助IOS開(kāi)發(fā)的同學(xué)
    2016-07-07
  • iOS實(shí)現(xiàn)圖片自動(dòng)切換效果

    iOS實(shí)現(xiàn)圖片自動(dòng)切換效果

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)圖片自動(dòng)切換效果,類似android畫(huà)廊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • iOS中你需要的彈窗效果總結(jié)大全

    iOS中你需要的彈窗效果總結(jié)大全

    彈窗是app中常見(jiàn)控件之一,一般由于項(xiàng)目需求,我們很少能直接使用系統(tǒng)提供的彈窗,這個(gè)時(shí)候就需要我們根據(jù)產(chǎn)品需求封裝自定義彈窗了。下面這篇文章主要給大家介紹了關(guān)于iOS中你需要的彈窗效果的相關(guān)資料,需要的朋友可以參考下
    2018-09-09
  • 刪除xcode 中過(guò)期的描述性文件方法

    刪除xcode 中過(guò)期的描述性文件方法

    下面小編就為大家分享一篇?jiǎng)h除xcode 中過(guò)期的描述性文件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • iOS中UILabel text兩邊對(duì)齊的實(shí)現(xiàn)代碼

    iOS中UILabel text兩邊對(duì)齊的實(shí)現(xiàn)代碼

    本文通過(guò)一段實(shí)例代碼給大家介紹了ios中uilabel text兩邊對(duì)齊的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2017-01-01
  • IOS 性能優(yōu)化中離屏渲染

    IOS 性能優(yōu)化中離屏渲染

    本文主要介紹了IOS 性能優(yōu)化中離屏渲染的資料,提供了幾種方法講解了優(yōu)化,有需要的小伙伴可以參考下
    2016-10-10
  • 詳解iOS 驗(yàn)證碼輸入的實(shí)現(xiàn)思路

    詳解iOS 驗(yàn)證碼輸入的實(shí)現(xiàn)思路

    這篇文章主要介紹了iOS 驗(yàn)證碼輸入一種實(shí)現(xiàn)思路,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • 干貨分享!iOS10 SiriKit QQ適配詳解

    干貨分享!iOS10 SiriKit QQ適配詳解

    干貨分享!主要為大家詳細(xì)介紹了!iOS10 SiriKit QQ適配,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評(píng)論

鹿泉市| 改则县| 昆明市| 万山特区| 宝兴县| 德令哈市| 潞城市| 贵溪市| 绍兴县| 南江县| 老河口市| 仁怀市| 津南区| 汾阳市| 满城县| 奎屯市| 孟津县| 绩溪县| 富锦市| 屏东县| 封开县| 长岭县| 东丰县| 富源县| 天台县| 宝坻区| 新蔡县| 达日县| 岑溪市| 阿拉善右旗| 禄劝| 册亨县| 赤城县| 武鸣县| 海兴县| 新丰县| 虹口区| 旺苍县| 天台县| 马山县| 青海省|