如何确保我的计时器运行没有比赛



这不是实际的代码,只是为了在实际代码中提供逻辑背后的想法。我需要在定时器功能中加入互斥锁 mylock2 吗?计时器每 0.02 秒运行一次。或者,计时器在这方面是安全的?

Static NSTimer *mylock1 = nil;  //initialized and used for another purpose
Static NSTimer *mylock2 = nil   //initialized and used for the timer

- (void)timerFireMethod:(NSTimer*)theTimer
{
[mylock2  lock];
Self.Mycount = 0;
for (int j = 0; j <n; j++)
{
if (b) NSLog(@”Hi”);
else Self.Mycount = Self.Mycount + 1;
}
If (Self.Mycount == n)
[self stopMytimer];
[mylock2  unlock];
}

您可能误解了NSTimer的工作原理。

NSTimer调用由运行循环处理,则在计划计时器时,它将附加到当前运行循环。不出所料,运行循环是一个循环,在单个线程上运行。运行循环的每次迭代都会检查是否需要触发任何计时器,如果是,则会调用它,因此在该调用返回之前,运行循环将执行的下一个操作不会发生......

如果计时器每

0.02 秒触发一次,如何取消重叠的计时器调用?

在正常情况下,调用根本无法重叠,因为在当前调用返回之前,下一个调用不会发生。

当然,如果您将工作异步调度到计时器中的另一个线程,从计时器中启动另一个运行循环并在该线程上安排计时器,或者您提出的任何其他创造性方式,那么可以为"重叠"调用创建条件。你的timerFireMethod:没有做这样的事情,只会被调用、执行和返回。

"Self.Mycount"在 for 循环执行的中间是否变为 0,从而导致意外行为?

可能 - 因为您的方法不是为这种情况设计的。但是,除非您启动另一个线程(使用NSThread,GCD(调度(等(,并将其Mycount设置为零,否则它不会发生。

呵呵

最新更新