GCD 信號量

1、dispatch_semaphore_create:創(chuàng)建一個Semaphore并初始化信號的總量
2、dispatch_semaphore_signal:發(fā)送一個信號,讓信號總量加1
3、dispatch_semaphore_wait:可以使總信號量減1,當信號量為0時就是一直等待(阻塞當前線程),否則就可以正常執(zhí)行。

注意:信號量的使用前提是:想清楚需要處理哪個線程等待(阻塞),又要哪個線程繼續(xù)執(zhí)行,然后使用信號量。

一、GCD 信號量實現(xiàn)線程同步,將異步操作轉(zhuǎn)換成同步操作

信號量

初始化信號量

  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    NSLog(@"2-------");
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        
        NSLog(@"異步結(jié)果------");
        dispatch_semaphore_signal(semaphore);
        
    });

    //信號量+1
    
    NSLog(@"3-------");

    
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    NSLog(@"4-------");

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"5-------");
截屏2022-09-07 下午4.10.11.png

二、線程安全 -- 多數(shù)據(jù)保護同一數(shù)據(jù)安全操作

dispatch_semaphore_t  semaphoreLock = dispatch_semaphore_create(1);

self.ticketSurplusCount = 50;

 //隊列任務(wù) 
 dispatch_queue_t queue1 = dispatch_queue_create("net.bujige.testQueue1", 
DISPATCH_QUEUE_SERIAL);
 // 隊列任務(wù)
 dispatch_queue_t queue2 = dispatch_queue_create("net.bujige.testQueue2", 
DISPATCH_QUEUE_SERIAL);

__weak typeof(self) weakSelf = self;
 dispatch_async(queue1, ^{
 [weakSelf saleTicketSafe];
 });
 
 dispatch_async(queue2, ^{
 [weakSelf saleTicketSafe];
 });

- (void)saleTicketSafe {
 while (1) {
 
 dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER);
 
 if (self.ticketSurplusCount > 0) { 
 self.ticketSurplusCount--;

 [NSThread sleepForTimeInterval:0.2];
 } else {  
 
 }
 
 dispatch_semaphore_signal(semaphoreLock);
 break;
 }
 
  dispatch_semaphore_signal(semaphoreLock);
 }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是信號量 信號量是一種特殊的變量,訪問具有原子性。 當信號量大于0時執(zhí)行wait操作信號量會減1, 當信號量為...
    lq_ios閱讀 2,653評論 2 6
  • Dispatch Semaphore信號量是一種持有計數(shù)的信號,實際開發(fā)中主要用于保持線程同步,將異步任務(wù)轉(zhuǎn)為同步...
    Geniune閱讀 240評論 0 0
  • 摘自 原文鏈接 dispatch_semaphore是GCD用來同步的一種方式,與他相關(guān)的共有三個函數(shù),分別是di...
    CoderWxd閱讀 421評論 0 0
  • 前言:在研究《iOS 性能監(jiān)控(二)—— 主線程卡頓監(jiān)控》中,發(fā)現(xiàn)有一些GCD信號量的知識之前沒有好好梳理過。故本...
    齊舞647閱讀 7,124評論 0 5
  • 信號量是基于計數(shù)器的一種多線程同步機制,用來管理對資源的并發(fā)訪問。信號量內(nèi)部有一個可以原子遞增或遞減的值。如果一個...
    ElaineYin閱讀 1,706評論 2 2

友情鏈接更多精彩內(nèi)容