關(guān)于開辟線程的開銷
iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)、棧空間(子線程512KB、主線程1MB)
GCD線程死鎖
//前提是在主線程中
dispatch_sync(dispatch_get_main_queue(), ^{
//code
});
死鎖的原因如下圖:
還有一種情況幸乒,就是同樣在主線程中,同步調(diào)用手動創(chuàng)建的串行隊列唇牧,是否會引發(fā)死鎖罕扎?為什么? 代碼如下:
//前提也是在主線程中
dispatch_queue_t queue = dispatch_queue_create("sync.queue", nil);
dispatch_sync(queue, ^{
//code
});
那么這種情況是否會產(chǎn)生死鎖呢丐重?答案是不會腔召,原因如下圖:
關(guān)于dispatch_barrier_sync
我們需要注意的地方是第一個參數(shù)所需要的隊列,必須是手動創(chuàng)建的并行隊列扮惦,這樣dispatch_barrier_sync
才會等待處于自己前面的任務(wù)執(zhí)行完畢后臀蛛,搶占資源執(zhí)行自己,等自己執(zhí)行完畢后崖蜜,隊列中的后續(xù)任務(wù)才能執(zhí)行浊仆。
如果使用dispatch_get_global_queue
進(jìn)行一個并行隊列的獲取,那么整個隊列中的任務(wù)會并行執(zhí)行豫领,dispatch_barrier_sync
也不會等待隊列中處于自己前面的任務(wù)執(zhí)行完畢抡柿,處于它后面的任務(wù)也不會等待dispatch_barrier_sync
任務(wù)執(zhí)行完畢,整個隊列的任務(wù)會并行執(zhí)行氏堤。
dispatch_queue_t queue = dispatch_queue_create("sync.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_barrier_sync(queue, ^{
//code
});