Dispatch Semaphore信號量是一種持有計數(shù)的信號肛度,實際開發(fā)中主要用于保持線程同步傻唾,將異步任務(wù)轉(zhuǎn)為同步執(zhí)行。
關(guān)鍵函數(shù)如下:
- dispatch_semaphore_create 創(chuàng)建一個Semaphore并初始化信號的總量
- dispatch_semaphore_signal 發(fā)送一個信號承耿,讓信號總量+1
- dispatch_semaphore_wait 可以使總信號量-1冠骄,當信號總量為0時就會一直等待(阻塞所在進程),否則正常執(zhí)行
線程同步
我們知道異步執(zhí)行耗時操作是不作任何等待的加袋,那如果在這個基礎(chǔ)上我們又需要使用異步執(zhí)行得到的結(jié)果進行另外一些額外操作時就需要使用線程同步來實現(xiàn)凛辣。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
__block int a = 0;
dispatch_async(queue, ^{
//追加任務(wù)
NSLog(@"執(zhí)行任務(wù)");
number = 10;
dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"end, a = %zd", a);
控制臺輸出:
執(zhí)行任務(wù)
end, a = 10
這里異步將任務(wù)追加到隊列后,執(zhí)行dispatch_semaphore_wait但是此時總信號量semaphore = 0职烧,因此當前線程會進入等待狀態(tài)扁誓。接著異步賦值操作真正執(zhí)行完畢后調(diào)用dispatch_semaphore_signal使總信號量semaphore = 1防泵,被阻塞的線程恢復(fù)并繼續(xù)往下執(zhí)行并打印“end, a= 10”到這里就已實現(xiàn)線程同步,異步線程操作被轉(zhuǎn)換為同步執(zhí)行蝗敢。
如果本文對你有幫助記得點個喜歡哈