簡體   English   中英

如何使用DISPATCH_QUEUE_CONCURRENT和障礙塊復制FIFO隊列?

[英]How to replicate a FIFO queue with DISPATCH_QUEUE_CONCURRENT and barrier blocks?

我讀到DISPATCH_QUEUE_SERIAL是一個FIFO隊列,只能在一個處理器核心上運行。

我的應用程序從磁盤獲取圖像,應用效果,創建UIImage並將圖像添加到數組。 數組中的順序必須與從磁盤讀取映像的順序相同。

當我使用DISPATCH_QUEUE_SERIAL ,維護訂單。

但是使用DISPATCH_QUEUE_CONCURRENT的設計模式是什么,所以圖像在所有內核上都得到了處理,但是一旦完成處理,它們就會按FIFO順序添加到數組中?

文檔sais:

一個同時執行塊的調度隊列。 雖然它們同時執行塊,但您可以使用屏障塊在隊列中創建同步點。

是否存在用於創建具有並發處理的FIFO隊列的障礙塊的示例?

我能想到的最簡單的GCD方法是這樣的:

NSArray* arrayOfImages = <your array of images to be processed>;
NSMutableArray* processedImages = [arrayOfImages mutableCopy];
dispatch_queue_t protectMutableArray = dispatch_queue_create("", 0);
dispatch_apply(arrayOfImages.count, dispatch_get_global_queue(0, 0), ^(size_t index) {
    UIImage* unprocessedImage = arrayOfImages[index];
    UIImage* processedImage = ProcessImage(unprocessedImage);
    dispatch_sync(protectMutableArray, ^{
        [processedImages replaceObjectAtIndex: index withObject: processedImage];
    });
});

dispatch_apply返回時, processedImages將包含保留其順序的所有已處理圖像,但處理將並行完成。 另請注意, dispatch_sync到串行隊列只是序列化processedImages變種,與排序無關。

暫無
暫無

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

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