多線程理解及GCD的同步異步操作

先說明今天的疑問
在做FMDB的本地存儲,查詢了解到,F(xiàn)MDB在多線程訪問數(shù)據(jù)庫,針對線程安全上,使用過了FMDatabaseQueue類進(jìn)行實例化數(shù)據(jù)庫。FMDatabaseQueue有兩個常用方法:

- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block

- (void)inDatabase:(void (^)(FMDatabase *db))block

這兩個方法實際上都是通過GCD創(chuàng)建一個串行隊列,這樣,每次的數(shù)據(jù)庫操作,都在這個串行隊列中完成,達(dá)到線程安全的目的。

inDatabase方法實現(xiàn)
inTransaction方法實現(xiàn)

到此都沒有任何毛病
但是我自己的毛病出來了
“既然FMDB是自己創(chuàng)建的queue,那也就是在主線程外的其他線程中執(zhí)行的,就不用在做后臺操作數(shù)據(jù)庫的處理了?!边@是我想的。
由于對線程隊列的理解不夠透徹,在我的意識里,GCD中,除去main_queue之外,用戶通過dispatch_queue_create創(chuàng)建的隊列(包括同步和異步隊列),GCD給我們的全局隊列dispatch_get_global_queue,都是不會再主線程去執(zhí)行任務(wù)的。
簡化就是,我以為(注意,是“我以為”)只有main_queue才會在主線程執(zhí)行任務(wù),其他的隊列都是在其他線程執(zhí)行任務(wù)。

NSError

我上邊說的我以為,我意識的都是錯的。

任務(wù)在哪個線程執(zhí)行,與隊列關(guān)系不大(也是有一定關(guān)系,后面說),主要看這個任務(wù)代碼,是同步執(zhí)行還是異步執(zhí)行。

queue只是一個管理任務(wù)的數(shù)組,他所能控制的是任務(wù)的順序執(zhí)行還是一起執(zhí)行
同步異步才能決定我們是否開啟新線程,上圖說比較清晰

基礎(chǔ)概念
這幾個詞對應(yīng)的東西能干什么
組合效果

這里就不一一列舉各種情況了,文章最后會給出上邊三張圖的原著,下邊只是簡單的截一個自己測試的圖

很明顯了

最后感謝 http://www.itdecent.cn/p/414b8e91e021 作者

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

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

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