GCD串行队列是否使用所有CPU核心



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

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

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

串行队列=1个任务=1个核心。但是在您的用例中,真正的问题是I/O争用。如果您生成一个并发队列从一个资源中读取,会发生什么?当CPU轮流读取磁盘时,每个块上的CPU都处于空闲状态。GCD对空闲CPU增加线程池做出反应。在这种情况下,这会导致过多的线程和更多的争用。

解决方案是使用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...
        });
    });
}

串行队列每次运行一个任务,因此每个串行队列每次只使用一个核心(尽管没有定义在任何时候使用哪个核心,并且可以更改)。

最新更新