如何實現(xiàn)多讀單寫

一.使用GCD實現(xiàn)多讀單寫
1.dispatch_barrier_async

dispatch_barrier_sync()或者dispatch_barrier_async()入隊的block,會等到所有的之前入隊的block執(zhí)行完成后才開始執(zhí)行渠退。在barrier block后面入隊的所有的block蕾盯,會等到到barrier block本身已經(jīng)執(zhí)行完成之后才繼續(xù)執(zhí)行妙同。

  • dispatch_barrier 是一個類似于dispatch_async()/dispatch_sync()的API属拾,它可以將barrier block提交到隊列中,barrier block 只有提交到自定義的并發(fā)隊列中才能真正的當做一個柵欄,它在這里起到一個承上啟下的作用,只有比它(barrier block)先提交到自定義并發(fā)隊列的block全部執(zhí)行完成,它才會去執(zhí)行,等它執(zhí)行完成腮恩,在它之后添加的block才會繼續(xù)往下執(zhí)行。
  • 當dipatch_barrier block沒有被提交到自定義的串行隊列中温兼,它與dispatch_async()/dispatch_sync()的作用是一樣的秸滴。

場景需求:需要異步完成三個任務。任務一募判、任務二荡含、任務三。要求:任務三必須在任務一届垫、任務二完成之后觸發(fā)释液。這就需要使用dispatch_barrier_async。
特點:像一堵圍墻装处、成為任務的分割線误债。

    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        //任務1
        for (int i = 0; i < 2; i++) {
            NSLog(@"我是任務一、來自線程:%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        //任務2
        for (int i = 0; i < 2 ; i++) {
            NSLog(@"我是任務二妄迁、來自線程:%@",[NSThread currentThread]);
        }
    });
    
    
    dispatch_barrier_async(queue, ^{
        //柵欄
        for (int i = 0; i < 1 ; i++) {
            NSLog(@"我是分割線寝蹈、來自線程:%@",[NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        //任務3
        for (int i = 0; i < 1 ; i++) {
            NSLog(@"我是任務三、來自線程:%@",[NSThread currentThread]);
        }
    });

2.使用dispatch_barrier_async實現(xiàn)多讀單寫鎖
- (void)test2{
    // 這里必須的自定義的并發(fā)隊列登淘,不能使用全局并發(fā)隊列箫老,或者串行隊列
    self.queue = dispatch_queue_create("my_quene", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i = 0; i < 10; i++) {
        dispatch_async(self.queue, ^{
            [self read];
        });
        
        dispatch_async(self.queue, ^{
            [self read];
        });
        
        dispatch_async(self.queue, ^{
            [self read];
        });
        
        dispatch_barrier_async(self.queue, ^{
            [self write];
        });
    }
}


- (void)read {
    NSLog(@"read");
}

- (void)write
{
    NSLog(@"write");
}
一.使用pthread_rwlock_t實現(xiàn)多讀單寫
#import "ViewController.h"
#import <pthread.h>

@interface ViewController ()
@property (assign, nonatomic) pthread_rwlock_t lock;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 初始化鎖
    pthread_rwlock_init(&_lock, NULL);
    
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    for (int i = 0; i < 10; i++) {
        dispatch_async(queue, ^{
            [self read];
        });
        dispatch_async(queue, ^{
            [self write];
        });
    }
}


- (void)read {
    pthread_rwlock_rdlock(&_lock);
    
    NSLog(@"read");
    
    pthread_rwlock_unlock(&_lock);
}

- (void)write
{
    pthread_rwlock_wrlock(&_lock);
    

    NSLog(@"write");
    
    pthread_rwlock_unlock(&_lock);
}

- (void)dealloc
{
    pthread_rwlock_destroy(&_lock);
}


@end
  • pthread_rwlock_rdlock 讀取鎖
  • pthread_rwlock_wrlock 寫入鎖
  • pthread_rwlock_destroy 銷毀鎖
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市形帮,隨后出現(xiàn)的幾起案子槽惫,更是在濱河造成了極大的恐慌,老刑警劉巖辩撑,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界斜,死亡現(xiàn)場離奇詭異,居然都是意外死亡合冀,警方通過查閱死者的電腦和手機各薇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峭判,你說我怎么就攤上這事开缎。” “怎么了林螃?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵奕删,是天一觀的道長。 經(jīng)常有香客問我疗认,道長完残,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任横漏,我火速辦了婚禮谨设,結果婚禮上,老公的妹妹穿的比我還像新娘缎浇。我一直安慰自己扎拣,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布素跺。 她就那樣靜靜地躺著二蓝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亡笑。 梳的紋絲不亂的頭發(fā)上侣夷,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音仑乌,去河邊找鬼百拓。 笑死,一個胖子當著我的面吹牛晰甚,可吹牛的內容都是我干的衙传。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厕九,長吁一口氣:“原來是場噩夢啊……” “哼蓖捶!你這毒婦竟也來了?” 一聲冷哼從身側響起扁远,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俊鱼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畅买,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體并闲,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年谷羞,在試婚紗的時候發(fā)現(xiàn)自己被綠了帝火。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖犀填,靈堂內的尸體忽然破棺而出蠢壹,到底是詐尸還是另有隱情,我是刑警寧澤九巡,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布图贸,位于F島的核電站,受9級特大地震影響比庄,放射性物質發(fā)生泄漏求妹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一佳窑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧父能,春花似錦神凑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爱榕,卻和暖如春瓣喊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黔酥。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工藻三, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跪者。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓棵帽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渣玲。 傳聞我的和親對象是個殘疾皇子逗概,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容

  • 前言 當有個需求,A,B異步請求完成之后才能請求C,D忘衍。A,B,C逾苫,D都是異步請求。這個用dispatch_gro...
    楓葉無處漂泊閱讀 8,208評論 2 21
  • iOS中多線程 首先看一道面試題 iOS中多線程有哪些實現(xiàn)方案枚钓? iOS中铅搓,多線程一般有三種方案GCD、NSOpe...
    木子奕閱讀 652評論 0 1
  • 這段時間的研究內容的是鎖秘噪,因為實際開發(fā)中用到的比較少狸吞,文中難免會有錯誤,希望能夠多多指正。這篇博客的第一部分是一些...
    kikido閱讀 485評論 0 1
  • 一蹋偏、簡介:多線程在之前進行過一篇詳細的基礎博客 iOS多線程 二便斥、多線程的基礎知識回顧 1.1、iOS中的常見多線...
    IIronMan閱讀 892評論 0 4
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月威始,有人笑有人哭枢纠,有人歡樂有人憂愁,有人驚喜有人失落黎棠,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53