2015-06-02 41 views
3

這個問題是關於Grand Central Dispatch,特別是dispatch_group_wait()dispatch_group_wait允許排隊嗎?

假設一個叫groupdispatch_group,其中有10個任務在等待執行。

在其他地方,我有一個任務需要等待group中的任何任務完成後才能執行。要做到這一點,我使用dispatch_group_wait(group, DISPATCH_TIME_FOREVER)

爲了區分它與group中的任務,我將其稱爲lonelyTask

如果另一個任務被添加到grouplonelyTask等待,其中最先被執行,lonelyTask或加入group任務?換句話說,當另一個任務正在等待執行時,是否將任務添加到group中,在等待任務之前進行「切入排隊」,還是保持其被調用的順序?

我已經搜索的文件,但一直沒能找到一個回答這個問題......

回答

2

組是一個+/-計數器(信號燈),每當它達到零時觸發。它不知道任務,因爲dispatch_group_async()只是一個包裝器,它在任務提交之前進入()組,並排入一個新塊,它將調用任務的塊,然後離開()該組。就這樣。甚至可以使用羣組作爲異步保留計數器或sml。

所以一般情況下「你不能」。但如果能夠將所有相關隊列[dispatch_set_target_queue())重定向到一個併發隊列,那麼該隊列上的dispatch_barrier_async()可以按照你想要的方式執行,如果以適當的隔離方式調用的話。請注意,該組與此無關。

此外,原始lonelyTask不是來自組的角度的任務 - 它是不相關的執行線程,等待組平衡。 「切入線」的同義詞是一個「障礙」。


另一種方法是爲每個任務集創建一個專用組並等待該特定組。這不會插入障礙 - 以下任務不會等待lonelyTask完成,任何不受控制的async()可能會「破壞規則」,導致有趣的調試會話。

3

dispatch_group_waitdispatch_group_notify都等待已進入團與過渡到零的項目數。因此,如果在完成所有原始10個任務之前向組中添加第十一個任務,則在繼續之前調用dispatch_group_wait將等待全部11個任務完成。