并行與并發(fā):
1.并發(fā):當(dāng)有多線程操作時(shí),如果系統(tǒng)只有一個(gè)cpu,根本不可能真正同時(shí)進(jìn)行一個(gè)以上的線程,只能把cup運(yùn)行時(shí)間劃分成若干段,再將時(shí)間分配給各個(gè)線程執(zhí)行,在一個(gè)時(shí)間段的線程代碼運(yùn)行時(shí),其他的處于掛起狀態(tài).
2.并行:系統(tǒng)一個(gè)以上cpu時(shí),一個(gè)cpu執(zhí)行一個(gè)線程,真正意義上的同時(shí)進(jìn)行.
并行隊(duì)列為并發(fā)執(zhí)行,串行隊(duì)列沒有并發(fā).
同步與異步,并行隊(duì)列與串行隊(duì)列綜合使用時(shí),對(duì)線程進(jìn)行分析來理解程序執(zhí)行順序.
1.dispatch_sync:同步追加任務(wù),要等待函數(shù)返回,不會(huì)另起線程.
注意:如果追加到的隊(duì)列為串行隊(duì)列,所在的線程跟當(dāng)前所在線程相同,會(huì)造成相互等待,程序崩潰.(所以不能再主線程當(dāng)中執(zhí)行 dispatch_sync(dispatch_get_main_queue(), block))
2.dispatch_async:異步追加任務(wù),不等待函數(shù)返回,一般新追加任務(wù)時(shí)會(huì)另起線程,再次追加任務(wù)時(shí)要看追加的隊(duì)列:若為DISPATCH_QUEUE_SERIAL(串行隊(duì)列),則不會(huì)另起線程,和上一次任務(wù)在同一線程當(dāng)中,并等待上一個(gè)任務(wù)執(zhí)行完成后,再執(zhí)行; 若為DISPATCH_QUEUE_CONCURRENT(并行隊(duì)列),任務(wù)并發(fā)執(zhí)行,會(huì)另起線程(可能是前面任務(wù)結(jié)束后釋放的線程).要注意一點(diǎn):通過dispatch_semaphore_t(信號(hào)量)可設(shè)置并行隊(duì)列的最大并發(fā)量.
dispatch_group_t:
將隊(duì)列放在group中執(zhí)行
dispatch_group_notify:
等待group中任務(wù)全部執(zhí)行完畢后執(zhí)行其中追加的任務(wù).若使用dispatch_group_enter將空任務(wù)放到group中,必須使用dispatch_group_leave取出空任務(wù),才能執(zhí)行dispatch_group_notify中的任務(wù),否則一直等待.
dispatch_barrier_sync,dispatch_barrier_async(設(shè)置屏障)
共同點(diǎn):
1、等待在它前面插入隊(duì)列的任務(wù)先執(zhí)行完
2昌犹、等待他們自己的任務(wù)執(zhí)行完再執(zhí)行后面的任務(wù)
不同點(diǎn):
1、dispatch_barrier_sync將自己的任務(wù)插入到隊(duì)列的時(shí)候,需要等待自己的任務(wù)結(jié)束之后才會(huì)繼續(xù)插入被寫在它后面的任務(wù),然后執(zhí)行它們
2、dispatch_barrier_async將自己的任務(wù)插入到隊(duì)列之后螃诅,不會(huì)等待自己的任務(wù)結(jié)束状囱,它會(huì)繼續(xù)把后面的任務(wù)插入到隊(duì)列术裸,然后等待自己的任務(wù)結(jié)束后才執(zhí)行后面任務(wù)。
dispatch_apply:
多次執(zhí)行某個(gè)任務(wù)
定時(shí)器(與NSTimer不同,不受RunLoop約束亭枷,比NSTimer更加準(zhǔn)時(shí),可暫停dispatch_suspend)
dispatch_source_t soure;
- (void)targetSource{
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
soure = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(soure, DISPATCH_TIME_NOW, 1, 1);
dispatch_source_set_event_handler(soure, ^{
NSLog(@"soure_event:==%@", [NSThread currentThread]);
});
dispatch_resume(soure);
}