我正在开发一个相对简单的 iPhone 应用程序,该应用程序有一个多轮计时器,带有许多设置,例如轮数和轮长。我们允许在计时器运行时更新某些设置,这意味着计时器可能正在从设置正在写入的同一内存中读取。没有代码的关键部分,多个线程将同时执行,但设置中的代码可能会尝试写入计时器正在读取的内存。
就一个简单的例子而言,假设我们有一个全局变量 foo 并且有一个 NSTimer 方法,如下所示:
-(void)timerTick { NSString *x = foo;
然后在设置代码中,我们在计时器运行时执行此操作:
foo = @"测试";
在此应用程序中使 foo 成为原子就足够了吗?还是我们需要某种锁定方案?
谢谢。
最佳答案
通常在以通常方式使用NSTimer
时,您不必锁定。
更详细地说,当您使用 NSTimer
的 scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
创建计时器时,生成的计时器会添加到运行循环中您在其中创建计时器的线程。因此,如果您以这种方式在主线程上创建 NSTimer
实例,定时器的触发将作为主事件循环的一部分处理,因此您注册的回调将在主线程上调用,不在另一个线程上。因此,如果您不自己创建任何线程,则完全不用担心锁定等问题。
有关详细信息,请阅读 this .
关于iphone - 我的 iPhone 应用程序真的需要锁定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2137704/