2011-05-07 2 views
0

해야 할 일 : 전역 변수를 피하기 위해 배열이 포함 된 Singleton 클래스가 있습니다. 이 배열은 두 개의 다른 스레드에 의해 액세스됩니다 :
- 1) 첫 번째 스레드는 주 스레드이며이 NSMutableArray에 때때로 객체를 추가해야합니다.
- 2) 다른 스레드가 (루핑 TRUE 동안) 내가 무슨 짓을했는지 지금까지) 뭔가가 포함되어있는 경우 내 생각이었다공유 메모리가 "뮤텍스"이고 iPhone의 NSCondition이

) (배열을 비우려고 (하고 내 싱글 톤 클래스 을, 나는이 내 NSMutableArray (list) 및 NSCondition (conditionLock)입니다.
무엇 내 메인 스레드가하고있는 것은 :

[[sharedSingleton conditionLock] lock]; 
[[sharedSingleton list] addObject:obj]; 
[[sharedSingleton conditionLock] signal]; 
[[sharedSingleton conditionLock] unlock]; 

는 내가 거기에 물건을 올려하려고 할 때 비어하지 않도록 객체를 차단하려는. (공유 메모리 보호). 객체가 배열에 배치되면 다른 스레드에 신호를 보냅니다. 내가 올바르게 이해했다면, 이것은 세마포어처럼 카운터를 늘리는 것과 같습니다. 신호는 다른 스레드에게 "객체가 있습니다."라고 말합니다. 두 번째 스레드가하고있는 무엇

:

while (YES) { 
    [[sharedRequest conditionLock] lock]; 
    [[sharedRequest conditionLock] wait]; 
    RequestLauncher * req = [[RequestLauncher alloc] initWithGenericsObject:[[sharedRequest list] objectAtIndex:0]]; 
    [req performSelectorOnMainThread:@selector(Launch) 
           withObject: nil 
          waitUntilDone:YES]; 
    [[sharedRequest list] removeObjectAtIndex:0]; 
    [[sharedRequest conditionLock] unlock]; 
} 

그래서 난 내 문제는 내가 잠금 및 다음 신호를 기다리 있지만, 모든 애플의 예는 순서대로 점이다 같아요. 이 코드는 주 스레드에서 하나의 개체를 추가 할 때 작동하는 것 같습니다. 그러나 둘 이상을 추가하려는 경우 잠금 주위에서 차단됩니다.

편집 나는 다른 무언가를 시도했지만 동작이 예상 아니었다 : 이것처럼
while (YES) {
[[sharedRequest conditionLock] lock];
[[sharedRequest conditionLock] wait];
GenericsObject * obj = [[sharedRequest list] objectAtIndex:0];
[[sharedRequest list] removeObjectAtIndex:0];
[[sharedRequest conditionLock] unlock];
RequestLauncher * req = [[RequestLauncher alloc] initWithGenericsObject:obj];
[req performSelectorOnMainThread:@selector(Launch) withObject: nil waitUntilDone:YES];
}
, 나는 mainThread 개체를 추가 할 수 있었다 그래서 그 NSMutableArray의 잠금을 해제했다.

+1

안녕하세요, 단지 관측, 삶의 유일한 목적은 주 스레드에서 선택기를 호출하고 일종의 일을 끝낼 때까지 기다리는 두 번째 스레드를 갖는 목적을 패배시키는 두 번째 스레드가 있습니다. – idz

+0

당신은 절대적으로 옳습니다. 그래서 지금은 NSOperation을 사용합니다.방금 메인 스레드에서 비동기 NSURLConnection을 실행하는 데 문제가있었습니다. – Pierre

답변

1

나는 결국 대답을 얻었다.
저는 C 멀티 태스킹에 더 익숙하며, 여기에 혼란을 설명합니다!

기본적으로 코드는 거의 훌륭했습니다. 신호가 생각한 것은 "세마포어"의 값을 높이면 한 스레드가 5 번 신호를 보내면 다른 스레드도 대기 조건을 5 번 통과하게됩니다. 전혀 아닙니다. 첫 번째 스레드에서

내 코드가 해당 페이지 that page에 애플 exemple에 따라 (즉)

[[sharedSingleton conditionLock] lock]; 
[[sharedSingleton list] addObject:obj]; 
[[sharedSingleton conditionLock] signal]; 
[[sharedSingleton conditionLock] unlock]; 

좋았다, 여기에 내가 사람을 도움이 될

[[sharedRequest conditionLock] lock]; 
while (! ([[sharedRequest list] count] >0)) { 
    [[sharedRequest conditionLock] wait]; 
} 
GenericObjects * obj = [[sharedRequest list] objectAtIndex:0]; 
[[sharedRequest list] removeObjectAtIndex:0]; 
[[sharedRequest conditionLock] unlock]; 
RequestLauncher * req = [[RequestLauncher alloc] initWithGenericsObject:obj]; 
[[appDel queue] addOperation:req]; // appDel is an instance of the application delegate, and where queue is an instance of NSOperationQueue 

희망을했던 것입니다!

1

두 번째 스레드는 주 스레드에서 메소드를 호출하고 조건 잠금에서 메소드가 완료 될 때까지 기다립니다. DEADLOCK이 발생합니다. RequestLauncher를 두 번째 스레드에서 호출 할 수 없습니까?

+0

글쎄,이 스레드는 asynchrone 요청이기 때문에 주 스레드에서이 메서드를 호출하고 주 스레드에서만 사용할 수있는 실행 루프가 필요합니다. 한 번에 하나의 연결 만 만들 수 있도록 "완료 될 때까지 대기"합니다. 코드가이 외에도 나에게 좋게 들리니? 그럼 어떻게해야합니까? – Pierre

관련 문제