2010-01-26 5 views
4

저는 라운드 횟수와 라운드 길이와 같은 여러 가지 설정을 가진 다중 라운드 타이머가있는 비교적 간단한 iPhone 응용 프로그램을 만들고 있습니다. 타이머가 실행 중일 때 설정이 기록중인 동일한 메모리에서 타이머를 읽는 중일 수 있음을 의미하는 특정 설정을 허용합니다. 여러 스레드가 동시에 실행되지만 설정의 코드가 타이머가 읽는 메모리를 쓰려고 시도하는 코드의 중요한 부분은 없습니다.내 iPhone 응용 프로그램에서 Locking이 정말로 필요합니까?

간단한 예제의 관점에서

,의 우리 전역 변수 foo를 가정 해 봅시다 다음과 같이 보이는 NSTimer 방법이있다 :

- (무효) timerTick { 있는 NSString * X = foo는; 타이머가 실행되는 동안 }

는 설정 코드에서, 우리는이 작업을 수행 :

foo는 = "테스트"@;

이 응용 프로그램에서 foo 원자를 만드는 것으로 충분합니까? 아니면 잠금 체계가 필요합니까?

감사합니다.

답변

4

일반적으로 NSTimer을 사용할 때 잠글 필요가 없습니다.

NSTimerscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:으로 타이머를 만들면 결과 타이머가 타이머를 만드는 스레드의 실행 루프에 추가됩니다. 따라서 메인 스레드에서 NSTimer 인스턴스를 메인 스레드에 생성하면 타이머의 실행은 메인 이벤트 루프의 일부로 처리되므로 등록한 콜백은 다른 스레드가 아닌 기본 스레드에서 호출됩니다. 따라서 스레드를 직접 만들지 않으면 잠그는 데 전혀 문제가 없습니다.

자세한 내용은 this을 참조하십시오.

+1

"... 결과 타이머가 주 실행 루프에 추가되었습니다."에 대해서는 필요하지 않습니다. 아니요, 필수는 아닙니다. * 현재 실행 루프에 추가됩니다. 즉, ** 현재 스레드의 실행 루프 (주 스레드 **가 아닐 수도 있습니다). http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/clm/NSTimer/scheduledTimerWithTimeInterval:target:selector:userInfo : 반복 : http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSRunLoop_Class/Reference/Reference.html#//apple_ref/occ/clm/NSRunLoop/currentRunLoop –

+0

나는 이것이 생각되었다. 당신이 의미하는 바에 따라 더 많은 것을 말합니다 : "... 당신이 스레드를 직접 만들지 않는다면, 잠금 등에 대해서 전혀 걱정할 필요가 없습니다"이것은 맞습니다 : 다른 스레드를 생성하지 않았다면, 메인 스레드는 현재 스레드입니다 스레드이므로 타이머는 주 스레드의 실행 루프 *에있게됩니다. 스레드에서 타이머를 실행하려면 스레드를 직접 작성한 다음 해당 스레드에서 타이머를 작성하고 스케줄해야합니다. (그리고 나서 동기화에 대해 생각해야 할 것입니다.) –

+0

예, 완벽하게 맞습니다, 피터. 지적 해 주셔서 감사합니다. – Yuji

0

읽기/쓰기를 @ 동기화하거나 NSLock/NSRecursiveLock/NSConditionLock으로 설정할 수 있습니다. 표준 f}을 조기에 공개 할 위험을 감수하는 것보다 나은 f}을 사용하는 것이 더 좋습니다.

+0

NSTimers –

관련 문제