信號(hào)量
信號(hào)量是基于計(jì)數(shù)器的一種多線程同步機(jī)制收叶,用來(lái)管理對(duì)資源的并發(fā)訪問(wèn)掀潮。
信號(hào)量就是一種可用來(lái)控制訪問(wèn)資源的數(shù)量的標(biāo)識(shí)菇夸,設(shè)定了一個(gè)信號(hào)量,在線程訪問(wèn)之前仪吧,加上信號(hào)量的處理庄新,則可告知系統(tǒng)按照我們指定的信號(hào)量數(shù)量來(lái)執(zhí)行多個(gè)線程。
dispatch_semaphore相關(guān)的3個(gè)函數(shù)
// 創(chuàng)建信號(hào)量薯鼠,參數(shù):信號(hào)量的初值择诈,如果小于0則會(huì)返回NULL
dispatch_semaphore_t dispatch_semaphore_create(long value);
// 信號(hào)量減1 timeout參數(shù): 線程等待時(shí)間
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
// 信號(hào)量加1
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
使用dispatch_semaphore_create(long value)
創(chuàng)建的信號(hào)量,參數(shù)是信號(hào)量的初始值出皇,
在線程執(zhí)行到dispatch_semaphore_wait
時(shí)羞芍,系統(tǒng)會(huì)判斷該信號(hào)量計(jì)數(shù)是否為0,不為0就可以允許另一條線程進(jìn)行訪問(wèn)郊艘,并將該并發(fā)計(jì)數(shù)減1涩金;為0,則阻塞當(dāng)前線程暇仲,直到dispatch_semaphore_signal
將信號(hào)量加1才會(huì)繼續(xù)執(zhí)行步做。
也就是說(shuō)信號(hào)量為0則阻塞線程,大于0則不會(huì)阻塞奈附,通過(guò)改變信號(hào)量的值全度,來(lái)控制是否阻塞線程,從而達(dá)到線程同步斥滤。
在AFNetworking中的應(yīng)用
為了確保線程同步将鸵,作者創(chuàng)建了一個(gè)semaphore
并指定信號(hào)量為0,意味著如果信號(hào)量不能+1的話佑颇,在線程執(zhí)行到dispatch_semaphore_wait
的時(shí)候顶掉,當(dāng)前線程會(huì)被阻塞,阻塞時(shí)間可以是dISPATCH_TIME_NOW
,也可以是DISPATCH_TIME_FOREVER
挑胸,DISPATCH_TIME_FOREVER
會(huì)一直等待當(dāng)前信號(hào)量的增加才會(huì)繼續(xù)執(zhí)行痒筒。
如實(shí)例:
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSLog(@"1");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(2);
NSLog(@"2");
dispatch_semaphore_signal(semaphore);
});
NSLog(@"3");
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"4");
}
執(zhí)行順序會(huì)是:1 ~ 3 ~ 2 ~ 4。
這樣就做到了線程同步茬贵。