2010-01-26 2 views
4

Я работаю над относительно простым приложением iPhone, которое имеет многоканальный таймер с рядом настроек, таких как количество раундов и круглую длину. Мы разрешаем устанавливать определенные настройки во время работы таймера, что означает, что таймер может считывать из той же памяти, что и записи параметров. Не существует критических разделов кода, в которых одновременно выполняются несколько потоков, но код из настроек может пытаться записать память, с которой отсчитывает таймер.Действительно ли блокировка в моем приложении iPhone?

С точки зрения простого примера, скажем, мы глобальная переменная Foo и есть метод NSTimer который выглядит следующим образом:

- (Недействительными) timerTick { NSString * х = Foo; }

затем в коде настроек, мы делаем это в то время как таймер работает:

Foo = @ "тест";

Будет ли достаточно, чтобы сделать foo атомарным в этом приложении или нам нужна какая-то схема блокировки?

Спасибо.

ответ

4

Обычно вам не нужно блокировать, когда вы используете NSTimer обычным способом.

Более подробно, когда вы создаете таймер с NSTimerscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:, полученный таймер добавляется в цикл выполнения потока, в котором вы создаете таймер. Таким образом, если вы создаете экземпляр NSTimer в основном потоке таким образом, запуск таймера обрабатывается как часть цикла основного события, поэтому обратный вызов, который вы зарегистрировали, вызывается в основном потоке, а не в другом потоке. Таким образом, если вы сами не создаете ни одного потока, нет никаких проблем в отношении блокировки и т. Д.

Для получения дополнительной информации см. this.

+1

«... полученный таймер добавляется в основной цикл цикла». Нет, не обязательно. Он добавляется в цикл * current * run-i.e, цикл запуска на ** текущий поток, который не может быть основным потоком **. 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

Вы можете либо синхронизировать @synchronized, либо NSLock/NSRecursiveLock/NSConditionLock, что вы читаете и записываете. Лучше использовать стандартные способы сделать это, чем рисковать преждевременно публиковать ноль foo.

+0

Это не нужно для NSTimers –