淺談GCD的內(nèi)部實現(xiàn)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容