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)就隻能等待。有可能同時有幾輛車等待一個停車位。有些車主。沒有耐心,給自己設定了一段等待時間,這段時間内等不到停車位就走了,如果等到了就開進去停車。而有些車主就像把車停在這,是以就一直等下去。