天天看點

dispatch_semaphore做鎖使用的2種使用方式

dispatch_semaphore做鎖使用的2種使用方式

dispatch_semaphore_create(value) value是初始信号持有量

dispatch_semaphore_signal 信号量+1

dispatch_semaphore_wait 信号量-1

信号量的原理是:當信号計數大于0時,每條進來的線程使計數減1,直到變為0,變為0後其他的線程将進不來,處于等待狀态;執行完任務的線程釋放信号,使計數加1,如此循環下去。

方式一:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

dispatch_queue_t queue = dispatch_queue_create(“groupBlock”, NULL);

dispatch_async(queue, ^{

dispatch_semaphore_signal(semaphore);

});

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

方式二

dispatch_semaphore_t lock = dispatch_semaphore_create(1);

for (NSInteger i = 0; i < 10; i++)

{

dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSLog(@"%d", i);

        dispatch_semaphore_signal(lock);

    });
}
           

關于信号量,可以用停車來比喻:

  停車場剩餘4個車位,那麼即使同時來了四輛車也能停的下。如果此時來了五輛車,那麼就有一輛需要等待。信号量的值就相當于剩餘車位的數目,dispatch_semaphore_wait函數就相當于來了一輛車,dispatch_semaphore_signal。就相當于走了一輛車。停車位的剩餘數目在初始化的時候就已經指明了(dispatch_semaphore_create(value:Int))),調用一次dispatch_semaphore_signal,剩餘的車位就增加一個;調用一次dispatch_semaphore_wait剩餘車位就減少一個;當剩餘車位為0時,再來車(即調用dispatch_semaphore_wait)就隻能等待。有可能同時有幾輛車等待一個停車位。有些車主。沒有耐心,給自己設定了一段等待時間,這段時間内等不到停車位就走了,如果等到了就開進去停車。而有些車主就像把車停在這,是以就一直等下去。

繼續閱讀