2016-10-01 71 views

回答

14

dispatch_barrier_[a]sync意指與併發隊列使用。它們也用於與dispatch_[a]sync一起使用。

常見的用法是「多讀者,一個作者」模式。你建立一個併發隊列。對於「閱讀器」塊,您使用dispatch_[a]sync。對於「作家」塊,您使用dispatch_barrier_[a]sync

此設置允許併發閱讀,但一次只允許一個作者,並且在寫作發生時不能閱讀。

將此與一次只能有一個塊發生的串行隊列進行比較。

5

你的圖完美地說明了屏障是如何工作的。七個方塊已經發送到一個併發隊列中,四個沒有障礙物(圖中的方塊1到4),一個障礙物(圖中褐色的「障礙塊」),然後再沒有障礙物的兩個方塊圖中的塊5和6)。

正如你所看到的,前四個併發運行,但障礙塊將不會運行,直到前四個完成。直到「障礙物」完成後,最後兩個纔會開始。

與此相比,一個串行隊列,在沒有任務可以同時運行:

comparison

如果每塊分派給併發隊列用屏障布控,那麼你是對的,那這將等同於使用串行隊列。但是,只有當您將屏障調度塊與併發隊列上的非屏障調度塊組合起來時,屏障才能發揮作用。所以,當你想享受併發行爲時,不要使用障礙。但是,對於併發隊列中的單個塊需要類似串行的行爲,請使用屏障。

一個例子是,你可能會派出10個沒有障礙的街區,但隨後添加一個障礙物的第11個街區。因此,前10名可以相互並行運行,但是11名只會在前10名完成(實現「完成處理程序」行爲)時開始。

或者正如rmaddy所說(+1),屏障的另一個常見用途是您訪問某個共享資源的位置,您將允許其允許併發讀取(無障礙),但必須強制執行同步寫入(有障礙)。在這種情況下,您經常使用dispatch_sync作爲讀取,dispatch_barrier_async作爲寫入使用。

相關問題