基本概念
? ? ? ?信號量在iOS中控制多線程并發(fā)震糖,用的比較少,所以我們對這個知識點可能很陌生趴腋,現(xiàn)在讓我們一起來了解一下信號量的基本概念和用法吧吊说。有時候,我們?yōu)榱吮苊舛鄠€線程同時訪問共享資源优炬,我們不得不做資源的訪問設(shè)置颁井,我們只允許每次只能有一個線程訪問這個資源,也就是說蠢护,信號量是用來調(diào)協(xié)線程對共享資源的訪問雅宾。
dispatch_semaphore_create(long value)
創(chuàng)建一個可訪問資源數(shù)為value的信號量,value的值是大于等于0.例:dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);如果semaphore = NULL 的話葵硕,代表這個信號量創(chuàng)建失敗眉抬。
dispatch_semaphore_signal(dispatch_semaphore_t semaphore)
發(fā)送消息給semaphore,收到消息后贯吓,semaphore的value值會++。如果此時線程處于休眠狀態(tài)蜀变,線程會被喚醒悄谐,繼續(xù)處理任務(wù)。
dispatch_semaphore_wait(dispatch_semaphore_t semaphore , dispatch_time_t time)
檢測當(dāng)前信號量訪問資源數(shù)昏苏,如果semaphore的value值為0的時候尊沸,線程將被阻塞,否則贤惯,semaphore的value值將--洼专。
為了更好的理解,我舉個例子:我們?nèi)ツ承┦召M景區(qū)游玩時孵构,我們需要買票屁商,我們每個人類似于一個線程,當(dāng)我們進(jìn)景區(qū)時颈墅,需要通過檢票進(jìn)入蜡镶,檢票員檢查你手中的票通過后,會打開卡門讓你進(jìn)去恤筛,你進(jìn)去后官还,卡門又會關(guān)上。這里面毒坛,售票員類似dispatch_semaphore_signal函數(shù)的作用望伦,而卡門類似于dispatch_semaphore_wait的作用。好了現(xiàn)在你更好地理解了嗎煎殷?如果沒有屯伞,繼續(xù)看下面的代碼吧!
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
? ? [self task:@"task one starting"];
? ? dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
? ? [self task:@"task two starting"];
? ? dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
? ? [self task:@"task three starting"];
? ? dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
- (void)task:(NSString *)taskName{
NSLog(@"%@",taskName);
sleep(1);
}
運行程序后我們我們可以從LLDB看到下面的log輸出
2016-08-26 19:07:11.563 semaphore[60547:456881] task one starting
2016-08-26 19:07:12.569 semaphore[60547:456881] task two starting
2016-08-26 19:07:13.573 semaphore[60547:456881] task three starting
好了豪直,文章到此結(jié)束劣摇,你現(xiàn)在理解信號量了嗎?有什么問題可以給我留言弓乙!