簡體   English   中英

DispatchQueue 在 Swift 中與 main.sync 崩潰

[英]DispatchQueue crashing with main.sync in Swift

請向我解釋為什么我會崩潰?

線程 1:EXC_BAD_INSTRUCTION(代碼=EXC_I386_INVOP,子代碼=0x0)

在這個

DispatchQueue.main.sync { print("sync") }

這是我的代碼。

    override func viewDidLoad() {
    super.viewDidLoad()


    print("Start")
    DispatchQueue.main.async {
        print("async")

    }
    DispatchQueue.main.sync {
        print("sync")
    }
    print("Finish")
}

@sankalap,Dispatch.main是一個串行隊列,它有單個線程來執行所有操作。 如果我們在這個隊列上調用“sync”,它將阻止當前在該線程上運行的所有其他操作,並嘗試在內部同步中執行代碼塊。 這導致“死鎖”。

切勿在主隊列上調用同步功能

如果你在主隊列上調用sync函數,它將阻塞隊列,並且隊列將等待任務完成但是任務永遠不會完成,因為它甚至無法啟動,因為隊列是已被封鎖。 它被稱為死鎖

兩個(或有時更多)項目 - 在大多數情況下,線程 - 被認為是死鎖,如果它們都被卡住等待彼此完成或執行另一個動作。 第一個無法完成,因為它正在等待第二個完成。 但第二個無法完成,因為它正在等待第一個完成。

你需要小心。 想象一下,如果你調用sync並定位你正在運行的當前隊列。 這將導致死鎖情況。

使用sync可以跟蹤調度障礙,或者在需要等待操作完成之后才能使用閉包處理的數據。

何時使用同步?

當我們需要等到任務完成時。 我們確保某些函數/方法不是雙重調用時的Fe。 我們有同步並試圖阻止它被雙重調用,直到它完全結束。 當您需要等待在不同隊列上完成的任務時,然后才繼續處理當前隊列

同步與異步

使用GCD,您可以同步或異步分派任務。

任務完成后,同步函數會將控制權返回給調用者。

異步函數立即返回,命令完成任務但不等待它。 因此,異步函數不會阻止當前執行線程繼續執行下一個函數。

根據關於在隊列上執行dispatch_sync Apple 文檔 ,您當前使用的隊列將使代碼崩潰:

調用此函數並以當前隊列為目標會導致死鎖。

因為當前隊列是主隊列,當你繼續在主隊列上調用sync時,系統會明白當前主隊列必須等待當前隊列中的一些代碼完成,但是當前隊列(主隊列)沒有代碼,所以你永遠等待:

Apple 文檔:調用此 function 並針對當前隊列導致死鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM