iOS控制高併發-dispatch_semaphore(訊號量)的用法
阿新 • • 發佈:2019-01-26
1.前言:
在單執行緒的程式中,程式的執行有先後順序,但是在多執行緒的程式中,線上程之間的程式執行中沒有先後順序,因此會出現併發的情況,導致程式的不確定性,因此需要dispatch_semaphore做程式的高併發管理。
2.介紹:
dispatch_semaphore可以看作已整形作為計數方式進行控制的方式,dispatch_semaphore的基本單位是整形,在GCD中有三個函式可以進行控制:
dispatch_semaphore_create(a) 建立一個初始值為a的semaphore
dispatch_semaphore_wait 使訊號總量-1,並且當a的訊號量為大於0的時候,gcd執行緒繼續執行,當a的訊號量的值小於0時,gcd執行緒建立阻塞,其餘執行緒繼續執行。
dispatch_semaphore_signal 傳送一個訊號,使訊號量+1,
3.舉例:
//建立一個總數為0的訊號量 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [self setObject:object forKey:key block:^(TMCache *cache, NSString *key, id object) { //執行緒結束之後傳送訊號量 dispatch_semaphore_signal(semaphore); }]; //訊號量-1,方法等待,保持始終只有一個[self setObject:object forKey:key block]方法執行 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);