[英]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.