一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS中讀寫鎖的簡單實現方法實例

iOS中讀寫鎖的簡單實現方法實例

2021-12-29 14:45頭疼腦脹的代碼搬運工 IOS

讀寫鎖是計算機程序的并發控制的一種同步機制,也稱“共享-互斥鎖”、多讀者-單寫者鎖,讀操作可并發重入,寫操作是互斥的,這篇文章主要給大家介紹了關于iOS中讀寫鎖的簡單實現方法,需要的朋友可以參考下

 

廢話開篇

iOS 下的多線程的技術的應用衍生出了鎖的機制,試想,如果 iOS 下沒有多線程的概念,所有的代碼都會在同步環境下執行,那么,也就不會產生爭奪資源情況的發生,當然,也就沒有辦法利用多核的優勢。所以,多線程的應用是廣布的,而鎖的應用是局部的,所以,二者應相輔相成,來達到提高運行效率的同時提高程序運行的穩定性。

 

思考一、對于鎖的類型的理解

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

其中,互斥鎖 多線程在訪問加鎖中的臨界區前,會進入休眠,一直等待解鎖后系統調度
;自旋鎖 多線程在訪問加鎖中的臨界區前,不進入休眠,會一直忙等。 讀寫鎖 是一種思想,本質就是利用 互斥鎖 來實現特定的應用場景:多讀并行、讀與寫互斥,寫與寫互斥;對于其他的類型的鎖,比如:信號量、條件鎖、遞歸鎖,可以理解為是由以上基本類型的鎖實現的上層封裝。

 

思考二、讀寫鎖的實現邏輯

如果有這樣一塊公共資源,它的寫入是比較耗時,那么,在這段時間內要避免程序再次的進行寫入操作和讀取操作,這樣可以避免產生爭奪資源的問題,當然,讀取的過程可以并行。

先上一段代碼,這里模擬一個比較耗時的寫入過程,在模擬一個快速讀取的過程。

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

    });

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

在寫入的異步內執行了循環 10000 次的操作來模擬耗時任務;后面開辟了多線程進行讀取,在讀取的異步里,實現簡單的不同數量的循環來模擬耗時任務,這里的耗時次數遠小于寫入。

打印如下

iOS中讀寫鎖的簡單實現方法實例

通過輸出可以清晰的看到,寫入過程中還有很多讀取的操作在同時進行。致于是先開始讀取還是開始寫入,這里其實并不用去關心,本身它們也是由系統決定的,但是,這里需要控制一下代碼,來實現讀寫互斥,即在寫的過程中,禁止讀取操作的介入。同時,也需要實現寫寫互斥。對于,多讀,其實這里并不需要過多干涉,因為,本身就允許多讀的邏輯。

 

思考三、簡單封裝讀寫鎖,滿足讀寫邏輯

利用互斥鎖封裝讀取加、解鎖;寫入加、解鎖

//初始化讀取鎖
static pthread_mutex_t r_plock =  PTHREAD_MUTEX_INITIALIZER;
//初始化寫入鎖
static pthread_mutex_t w_plock =  PTHREAD_MUTEX_INITIALIZER;
//記錄當前讀取次數,因為只要其值不為0,那么,就說明程序在讀取操作,這里停止寫入操作
static int current_read_times = 0;

進行讀取加鎖

//讀加鎖
- (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);
}

這里首先進行 讀取鎖 加鎖,這里加鎖的目的并不是鎖定讀取過程,而是鎖定了修改 current_read_times 的過程,當 current_read_times 變更后,如果為 1,那么,就對 寫入鎖 加鎖,這個寫入鎖就是鎖住寫入過程的。這兩個鎖的應用部分是有區別的。

進行讀取解鎖

//讀解鎖
- (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);
}

這里首先進行 讀取鎖 加鎖,目的還是對 current_read_times 修改的鎖,可以總結一下,讀寫鎖本質并不對多讀進行限制,所以,這里的讀取鎖是鎖住 current_read_times 修改過程,在加鎖的情況下進行 寫入鎖 狀態的變更,實現 讀與寫的互斥。后面進行狀態判斷,如果 current_read_times 為 0,說明當前所以讀取完成了,那么,對 寫入鎖 進行解鎖,解鎖后寫入操作就可以正常進行。這里解鎖的判斷為 == 0 與 加鎖的判斷 == 1 是一對,這樣就滿足了,一個加鎖過程對應一個解鎖條件。不會出現只有加鎖后而沒有解鎖的情況。

進行寫入加鎖

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

這里僅僅是對 寫入 操作進行加鎖。

進行寫入解鎖

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

這里僅僅是對 寫入 操作進行解鎖。

最后的代碼

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

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

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

打印如下

iOS中讀寫鎖的簡單實現方法實例

可以看待寫入過程是完整的一個打印順序,而讀取過程由于沒有鎖的保護并沒有按順序執行。

iOS中讀寫鎖的簡單實現方法實例

一個簡單的 讀寫鎖 就完成了。代碼拙劣,大神勿笑。

 

總結

到此這篇關于iOS中讀寫鎖的簡單實現的文章就介紹到這了,更多相關iOS讀寫鎖實現內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7025421259231985677

延伸 · 閱讀

精彩推薦
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
主站蜘蛛池模板: 欧美老肥妇bbb | 人人揉揉香蕉 | 亚洲另类第一页 | 日韩久久中文字幕 | 九九365资源稳定资源站 | 成人精品一级毛片 | 国产精品久久久久久久午夜片 | 亚洲AV综合99一二三四区 | 人与动人物性行为zozo共患病 | 精品午夜久久福利大片免费 | 欧洲肥女大肥臀tv | 国产成人精品一区 | 欧美激情亚洲 | 女学生被老师调教在教室 | 国产精品午夜性视频网站 | 全程粗语对白视频videos | 青青草国产精品久久久久 | 亚洲成色爱我久久 | 桥本有菜在线四虎福利网 | 国产精品中文 | 免费视频片在线观看 | 金莲一级淫片aaaaaa | 91九色最新地址 | 缴情五月天 | 亚洲品质自拍网站 | 亚洲黄色成人 | 亚洲国产午夜 | 久久精品手机观看 | 猛操女人 | h日本漫画全彩在线观看 | 99在线免费观看视频 | 国产高清经典露脸3p | 性色AV乱码一区二区三区视频 | www.色啪啪.com| 毛片手机在线视频免费观看 | 日本在线亚州精品视频在线 | 超级碰碰青草免费视频92 | 爱福利视频一区 | 欧美一区不卡二区不卡三区 | 日本加勒比无码av | 热色综合 |