CGD
GCD是蘋果開發(fā)的多線程編程的解決方案,通過簡單的API就可以實現(xiàn)創(chuàng)建新線程去執(zhí)行我們需要執(zhí)行的任務(wù),不需要我們手動地創(chuàng)建和管理線程。它的API包含在libdispatch庫中。
Dispatch Queue
Dispatch Queue是GCD中很重要的一部分,它是負(fù)責(zé)執(zhí)行處理的隊列,它的內(nèi)部主要由三部分構(gòu)成:
1、一個管理追加block的C語言實現(xiàn)的FIFO的隊列;
2、處理信號量的原子操作;
3、用于管理線程的C語言實現(xiàn)的一些容器。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"我的操作");
});
dispatch queue 通過 dispatch_async等函數(shù)將block追加到隊列上,block不是直接追加到隊列,而是先構(gòu)成一個dispatch continuation構(gòu)造體,構(gòu)造體包含了這個block還有一些上下文信息,例如block所屬的dispatch group等等。
Dispatch Queue執(zhí)行過程是怎么的呢?
workqueue
工作隊列,是一個用于創(chuàng)建內(nèi)核線程的接口,通過它創(chuàng)建的內(nèi)核線程來執(zhí)行內(nèi)核其他模塊排列到隊列里的工作。不同優(yōu)先級的dispatch queue對應(yīng)著對應(yīng)優(yōu)先級的workqueue。GCD初始化的時候,使用pthread_workqueue_create_np創(chuàng)建pthread_workqueue
執(zhí)行過程
dispatch queue執(zhí)行block時,先從dispatch queue自身的FIFO隊列中取出dispatch continuation,接著調(diào)用pthread_workqueue_additem_np函數(shù),傳入這些參數(shù):dispatch queue自身、一個符合其優(yōu)先級workqueue,dispatch continuation。
調(diào)用該函數(shù)后,會通知對應(yīng)的workqueue增加執(zhí)行項目,XNU內(nèi)核生成線程,線程執(zhí)行pthread_workqueue函數(shù)執(zhí)行block