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