dispatch_semaphore信號量用法

關于多線程的并發(fā)菠镇,我們可能會選擇使用NSOperationQueue來處理,那么在GCD中如何處理多線程的并發(fā)呢?就是dispatch_semaphore
 
在GCD中有三個函數(shù)是semaphore的操作哈踱,分別是:
  dispatch_semaphore_create   創(chuàng)建一個semaphore
  dispatch_semaphore_signal   發(fā)送一個信號
  dispatch_semaphore_wait    等待信號

第一個函數(shù)有一個整形的參數(shù),我們可以理解為信號的總量梨熙,dispatch_semaphore_signal是發(fā)送一個信號开镣,自然會讓信號總量加1,dispatch_semaphore_wait等待信號咽扇,當信號總量少于0的時候就會一直等待邪财,如果線程在一個信號量上等待時,線程會被阻塞(如果有必要的話)质欲,直至計數(shù)器大于零树埠,然后就可以正常的執(zhí)行,并讓信號總量-1嘶伟,根據(jù)這樣的原理怎憋,我們便可以快速的創(chuàng)建一個并發(fā)控制來同步任務和有限資源訪問控制。

信號量在多線程開發(fā)中被廣泛使用奋早,當一個線程在進入一段關鍵代碼之前盛霎,線程必須獲取一個信號量,一旦該關鍵代碼段完成了耽装,那么該線程必須釋放信號量愤炸。其它想進入該關鍵代碼段的線程必須等待前面的線程釋放信號量。

信號量的具體做法是:當信號計數(shù)大于0時掉奄,每條進來的線程使計數(shù)減1规个,直到變?yōu)?,變?yōu)?后其他的線程將進不來姓建,處于等待狀態(tài)诞仓;執(zhí)行完任務的線程釋放信號,使計數(shù)加1速兔,如此循環(huán)下去墅拭。

-(void)loginRequest
{
    NSLog(@"進入登錄請求");
    dispatch_semaphore_t loginSem = dispatch_semaphore_create(0);
    
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    NSString *name = [userDefault objectForKey:@"UserName"];
    NSString *psw = [userDefault objectForKey:@"Password"];
    
    if (name && psw)
    {
        
      //url 登錄請求接口 回調(diào)后做登錄成功與失敗的處理 并釋放信號量
//        [self createLoginRequest:name password:psw completion:^(id response, NSString *error) {
        
//             self.loginStatus = error == nil ? true : false;
            NSLog(@"登錄返回");
            dispatch_semaphore_signal(loginSem);
//        }];
        
    } else {
        //登錄失敗的處理
        //self.loginStatus == false
        dispatch_semaphore_signal(loginSem);
    }
    // 等待重登錄信號
    NSLog(@"等待登錄信號");
    dispatch_semaphore_wait(loginSem, DISPATCH_TIME_FOREVER);
    
    NSLog(@"通過登錄信號,繼續(xù)執(zhí)行");
    
//    if (self.loginStatus == false)
//    {
//        if (block) block(nil, @"登錄失敗, 請重新登錄");    // 收到登錄失敗的涣狗,彈個提醒
//        return ;
//    } else {
//        NSLog(@"登錄成功");
//    }

}
上面是登錄請求的例子谍婉,請求前創(chuàng)建信號量為0,然后做登錄請求镀钓,當?shù)卿浾埱筇幚硗旰笏氚荆尫判盘柫浚?才會執(zhí)行`通過登錄信號,繼續(xù)執(zhí)行`丁溅。否則沒有釋放信號唤蔗,信號量為0,會一直等待直到其釋放。

參考

GCD 信號量控制并發(fā) (dispatch_semaphore)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妓柜,一起剝皮案震驚了整個濱河市箱季,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌领虹,老刑警劉巖规哪,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塌衰,居然都是意外死亡诉稍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門最疆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杯巨,“玉大人,你說我怎么就攤上這事努酸》” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵获诈,是天一觀的道長仍源。 經(jīng)常有香客問我,道長舔涎,這世上最難降的妖魔是什么笼踩? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮亡嫌,結(jié)果婚禮上嚎于,老公的妹妹穿的比我還像新娘。我一直安慰自己挟冠,他們只是感情好于购,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著知染,像睡著了一般肋僧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上控淡,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天色瘩,我揣著相機與錄音,去河邊找鬼逸寓。 笑死,一個胖子當著我的面吹牛覆山,可吹牛的內(nèi)容都是我干的竹伸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勋篓!你這毒婦竟也來了吧享?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤譬嚣,失蹤者是張志新(化名)和其女友劉穎钢颂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拜银,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡殊鞭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尼桶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片操灿。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泵督,靈堂內(nèi)的尸體忽然破棺而出趾盐,到底是詐尸還是另有隱情,我是刑警寧澤小腊,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布救鲤,位于F島的核電站,受9級特大地震影響秩冈,放射性物質(zhì)發(fā)生泄漏本缠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一漩仙、第九天 我趴在偏房一處隱蔽的房頂上張望搓茬。 院中可真熱鬧,春花似錦队他、人聲如沸卷仑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锡凝。三九已至,卻和暖如春垢啼,著一層夾襖步出監(jiān)牢的瞬間窜锯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工芭析, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锚扎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓馁启,卻偏偏與公主長得像驾孔,于是被迫代替她去往敵國和親芍秆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容