如何使用 DISPATCH_QUEUE_CONCURRENT 和屏障块复制 FIFO 队列?

Posted

技术标签:

【中文标题】如何使用 DISPATCH_QUEUE_CONCURRENT 和屏障块复制 FIFO 队列?【英文标题】:How to replicate a FIFO queue with DISPATCH_QUEUE_CONCURRENT and barrier blocks? 【发布时间】:2013-09-30 16:11:18 【问题描述】:

我读到DISPATCH_QUEUE_SERIAL 是一个 FIFO 队列,只能在一个处理器内核上运行。

我的应用程序从磁盘获取图像、应用效果、创建 UIImage 并将图像添加到数组中。数组中的顺序必须与我从磁盘读取图像的顺序相同。

当我使用DISPATCH_QUEUE_SERIAL 时,订单保持不变。

但是使用 DISPATCH_QUEUE_CONCURRENT 的设计模式是什么,所以图像在所有内核上都得到处理,但一旦处理完成,它们就会按 FIFO 顺序添加到数组中?

文档说明:

并发执行块的调度队列。虽然他们 并发执行块,你可以使用屏障块来创建 队列中的同步点。

是否有障碍块创建具有并发处理的 FIFO 队列的示例?

【问题讨论】:

跟踪它们应该进入数组的索引难道不够吗?然后无论它们完成加载的顺序如何,它们都会进入该索引。 是的,我也想过这个。但我希望有一个 GCD 设计模式来解决这个问题。 【参考方案1】:

我能想到的最简单的 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的突变,与排序无关。

【讨论】:

以上是关于如何使用 DISPATCH_QUEUE_CONCURRENT 和屏障块复制 FIFO 队列?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?