簡體   English   中英

GCD串行隊列是否使用所有CPU內核?

[英]Does a GCD serial queue use all CPU cores?

我想渲染30個不同的圖像。 每個任務必須將不同的圖像層合並為一個最終圖像-30個最終圖像。

目前,我使用GCD串行隊列。 現在我想知道這種方法是否自動使用所有可用內核的CPU功能?

還是使用GCD並發隊列代替所有這些任務的渲染時間? 感謝您的澄清。

串行隊列= 1個任務= 1個核心。 但是用例中的真正問題是I / O爭用。 如果產生並發隊列以從一種資源讀取會發生什么情況? 最終,當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...
        });

    });
}

串行隊列一次運行一個任務,因此每個串行隊列一次僅使用一個內核(盡管在任何時候都不會使用哪個內核,並且可以更改)。

暫無
暫無

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

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