2012-06-03 1 views
3

나는 멀티 스레딩을 처음 접했고 약간의 조언이 필요하다.멀티 쓰레드로 구현하는 가장 좋은 방법

내 코드에 ARC를 사용하고 있습니다.

문제 : 내가 만들고 mSomeThread

하자가 말을 아이바에게 인이

//Create a new thread 
mSomeThread = [[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil]; 

//start the thread 
[mSomeThread start]; 

같은 스레드를 시작 몇 가지 방법 1 초마다 화재 내 응용 프로그램에서 NSTimer을 설정 한 mSomeThread의 실행은 1 초 이상 걸리고, mSomeThread는 두 번째 할당됩니다. 즉, 한번 더 할당되기 전에 해제 된 ARC "rules"에 따라 할당됩니다.

첫 번째 스레드가 완료되지 않아서 상당히 강제되는 것을 의미합니까?

+0

이것은 도움이 될 수 있습니다 : http://stackoverflow.com/questions/7149403/nsthreads-in-automatic-referenc-countingarc – Adam

+0

링크를 주셔서 감사합니다,하지만 완전히 다른 문제로 나를 가리키는, 나는 autorelease 풀에 대해 알고 이미 내 코드에 추가했습니다. – deimus

+3

@deimus : 가능한 경우 스레드를 사용하지 마십시오. GCD를 사용하여 스레드를 생성하십시오. http://www.fieryrobot.com/blog/2010/06/12/threading-is-dead-long-live-threading/ – nhahtdh

답변

0

NSThread은 실행 기간 동안 자신을 유지합니다. mSomeThread을 다시 설정하면 실행중인 스레드가 너무 일찍 종료 될 위험이 없습니다.

-1

예. someMethod에 대한 현재 실행 스레드에 대한 참조를 실제로 유지해야하는 경우 새 스레드를 실제로 시작하려면 먼저 스레드가 완료 될 때까지 기다려야합니다. 이 일을 빠른 방법은 바로 [mSomeThread start];

while ([mSomeThread isExecuting]) { 
    sleep(1); 
} 

를 추가하는 것입니다.

그런데 NSThread를 다시 구현하고 반복적 인 NSTimer를 main 구현 안에 설치하고 싶습니다. 같은 뭔가 :

- main { 
     @autoreleasepool { 
      [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(someMethod) userInfo:nil repeats:NO]; 
      [[NSRunLoop currentRunLoop] run]; 
     } 
} 
+0

sleep()을 동기화 프리미티브로 사용하는 것은 잘못되었습니다. 호출 스레드를 차단하고, 불필요한 자원을 사용하며, 다른 문제점을 일으킬 수 있습니다. – bbum