iphone - GCD 串行队列是否使用所有 CPU 内核?

标签 iphone ios multithreading grand-central-dispatch

我想渲染 30 张不同的图像。每个任务都必须将不同的图像层合并为一个最终图像——30 个最终图像。

目前我使用 GCD 串行队列。现在我想知道这种方法是否会自动使用所有可用内核的 CPU 能力?

或者我可以在使用 GCD 并发队列时改进所有这些任务的渲染时间吗? 感谢您的澄清..

最佳答案

串行队列 = 1 个任务 = 1 个核心。但您用例中的真正问题是 I/O 争用。如果你产生一个并发队列来读取一个资源会发生什么?当 CPU 轮流读取磁盘时,您最终会在每个 block 上闲置 CPU。 GCD 对空闲 CPU 作出 react ,增加线程池。在这种情况下,会导致过多的线程和更多的争用。

解决方案是使用 dispatch_io 函数进行读取,并在不同的并发队列上进行图像处理,该队列可以根据需要自由增长。

dispatch_queue_t imageProcessing = dispatch_queue_create("com.yourReverseDomainHere", DISPATCH_QUEUE_CONCURRENT);

for (NSURL *url in ...){
    dispatch_io_t io = dispatch_io_create_with_path(DISPATCH_IO_RANDOM,[[url path] fileSystemRepresentation], O_RDONLY, 0, NULL, NULL);
    dispatch_io_set_low_water(io, SIZE_MAX);
    dispatch_io_read(io, 0, SIZE_MAX, dispatch_get_main_queue(),^(bool done, dispatch_data_t data, int error){

        // convert the file from dispatch_data_t to NSData
        const void *buffer = NULL;
        size_t size = 0;
        dispatch_data_t tmpData = dispatch_data_create_map(data, &buffer, &size);
        NSData *nsdata = [[NSData alloc] initWithBytes:buffer length:size];
        dispatch_release(tmpData);
        free(buffer);

        // send this nsdata elsewhere for processing
        dispatch_async(imageProcessing, ^{
            // ...image processing code...
        });

    });
}

关于iphone - GCD 串行队列是否使用所有 CPU 内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035277/

相关文章:

iphone - 在 TableView 中保存和加载 UISwitch 状态

objective-c - 在 Objective C 中声明变量时什么时候不应该使用星号 (*)

iphone - 开发者拒绝状态?

jQuery Mobile 超链接在 iOS 中不起作用

multithreading - 如何在 MFC 中添加线程完成时的事件处理程序?

iphone - 请求发送获取错误 : [CFString release]: message sent to deallocated instance 0x6a83e00

ios - ipatool 在 xcode 9 中因异常而失败

ios - NSIndexPath 无法将项目、部分或行识别为属性

javascript - 自己线程中的 Selenium 异步脚本会阻止其他脚本

java swing 从不同线程的 JTextField 获取值