2013-05-28 1 views
0

배열 객체가 sharedArray이고 생성 속도가 느립니다. 나는 먼저 그것들을 만들고 그것들을 배열에 동시에 삽입한다. 그 후 일부 독자는이 sharedArray에 동시에 액세스하여 객체를 가져 와서 독자적인 방식으로 처리합니다. 공유 리소스에 올바르게 액세스하지 않아서 발생하는 것으로 예상되는 충돌이 발생했습니다. 내가 잘못하고 있니?CGD에서 공유 리소스에 액세스하기위한 공통 큐

iOS 대상 배포 버전 5.1과 함께 ARC를 사용하고 있습니다. 리소스 (코드에 표시된)를 설정할 때 EXC_BAD_ACCESS 오류가 발생합니다.

대단히 감사합니다!

//Creation of the array 
dispatch_queue_t constructionQueue = dispatch_queue_create("constructionQueue", DISPATCH_QUEUE_CONCURRENT); 
dispatch_apply(numberOfSlowObjects, constructionQueue, ^(size_t i) { 
    __block SlowObject *slowOb = [[SlowObject alloc] init]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [sharedArray setObject:slowOb atIndexedSubscript:i]; //HERE I GET THE ERROR 
    }); 
}); 
dispatch_release(constructionQueue); 

//Accessing the array from the different readers 
dispatch_queue_t readersQueue = dispatch_queue_create("readersQueue", DISPATCH_QUEUE_CONCURRENT); 
dispatch_apply(readers.count, readersQueue, ^(size_t i) { 
    Reader *reader = [readers objectAtIndex:i]; 
    dispatch_queue_t processQueue = dispatch_queue_create("processQueue", DISPATCH_QUEUE_CONCURRENT); 
    dispatch_apply(numberOfSlowObjects, processQueue, ^(size_t j) { 
     __block SlowObject *slowOb; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      slowOb = [sharedArray objectAtIndex:j]; 
     }); 
     [reader process:slowOb]; 
    }); 
    dispatch_release(processQueue); 
}); 
dispatch_release(readersQueue); 

그리고 sharedArray (공유 자원) 게으른 초기화 코드 :

- (NSMutableArray *) sharedArray 
{ 
    if(!_sharedArray){ 
     _sharedArray = [[NSMutableArray alloc] initWithCapacity:numberOfSlowObjects]; 
     for(int i=0;i<numberOfSlowObjects;i++) [_sharedArray addObject:[NSNumber numberWithInt:0]]; //null initialization; 
    } 
    return _sharedArray; 
} 
+0

이 오류가 발생하면 어떤 메시지가 나타 납니까? – Sven

+0

이 줄에 위의 오류가 표시됩니다. slowOb = [sharedArray objectAtIndex : j] ;? 코드에 표시하십시오. –

+0

모든 것을 동시에 실행하고 있으므로 모든 것이 올바르게 작동하는지 확인하기 위해 일부 NSLog를 넣어야합니다. 예를 들어 numberOfSlowObjects에 대한 NSLog는 값이 할당되고 J에 할당되도록합니다. 그런 다음 sharedArray에 액세스 할 때까지 아무것도 있는지 확인해야합니다. –

답변

0

내 생각은 당신이 뭔가 당신이 그것을 실행 시간에 의해 초기화하지 않습니다, 당신은 장소에 제로 검사를 모든 코드를 동시에 실행하면 일부 코드가 아직 존재하지 않을 수있는 값에 액세스하려고 시도 할 수 있음을 의미합니다.

당신이 제공하는 작은 그림으로 문제를 해결하기가 어려울 것이므로 일부 NSLog를 배치하거나 디버그하고 단계별로 실행하여 어레이가 실행될 때 어떤 일이 벌어지고 있는지 정확히 알 수 있습니다.

내 생각 엔 "j"(numberOfSlowObjects) 또는 "sharedArray"는 액세스하려고 할 때 존재하지 않습니다.

+0

답변 해 주셔서 감사합니다. 첫째, 병렬 실행을 디버깅하는 가장 좋은 방법을 잘 모릅니다 : NSLog를 어디에 넣으라고 제안하겠습니까? 오류가 자주 나타나지 않습니다. 둘째, 코드에서 특히 오류가 발생한 부분을 업데이트했습니다. 보시다시피, 이미 존재하는 배열의 지정된 위치에 값을 설정하는 것입니다. – kahlo

+0

좋아, sharedArray가 NSMutableArray로 설정되어 있는지 확인하면서 시작할 수 있습니까? 이 올바른지? 또한 sharedArray는 어디에서 초기화합니까? –

+0

이것은 원자로 선언 된 NSMutableArray입니다. 게으른 초기화 방법으로 초기화합니다. 내가 그것을 부를 때, 그것이 설정되어 있지 않다면, 그것을'[NSNumber numberWithInt : 0]'으로 채워서 만듭니다. – kahlo

관련 문제