2013-09-30 2 views
0

나는 DISPATCH_QUEUE_SERIAL이 FIFO 대기열이며 하나의 프로세서 코어에서만 실행된다는 것을 알았습니다.DISPATCH_QUEUE_CONCURRENT 및 배리어 블록을 사용하여 FIFO 큐를 복제하는 방법은 무엇입니까?

내 앱은 디스크에서 이미지를 가져 와서 효과를 적용하고, UIImage를 만들고 이미지를 배열에 추가합니다. 배열의 순서는 디스크에서 이미지를 읽는 순서와 동일해야합니다.

DISPATCH_QUEUE_SERIAL을 사용하면 주문이 유지됩니다.

DISPATCH_QUEUE_CONCURRENT을 사용하는 디자인 패턴은 어떤 이미지가 모든 코어에서 처리 되나 처리가 완료되면 FIFO 순서로 배열에 추가됩니까?

문서 SAIS : 블록 동시에 실행

디스패치 큐. 그들은 블록을 동시에 실행하지만, 차단 블록을 사용하여 큐 내에 동기화 포인트를 만들 수 있습니다.

동시 처리가있는 FIFO 대기열을 생성하는 배리어 블록의 예가 있습니까? 내가 생각할 수있는

+0

배열에서 어떤 색인을 가져와야하는지 계속 추적하는 것이 충분하지 않습니까? 그렇다면 그들이로드되는 순서에 관계없이 그들은 그 인덱스로 갈 것입니다. – micantox

+0

네, 이것도 생각했습니다. 하지만이 문제를 해결하기위한 GCD 디자인 패턴이 있기를 바랬습니다. – openfrog

답변

2

간단한 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_syncprocessedImages의 돌연변이를 직렬화하는 것으로 주문과는 아무런 관련이 없습니다.

관련 문제