如何终止等待@synchronized目标C的线程

时间:2009-05-21 10:31:30

标签: objective-c multithreading synchronization

我有一些像这样的代码:

doDatabaseFetch {
   ...
   @synchronized(self) {
      ...
   }
}

以及在用户使用视图时调用doDatabaseFetch的许多对象。

我的问题是,我有一个操作(导航到下一个视图),还需要数据库提取。我的问题是它击中了同一个同步块并等待轮到它了!我理想地喜欢这个操作来杀死所有等待的线程,或者给这个线程一个更高的优先级,以便它可以立即执行。

Apple说

  

退出线程的推荐方法是让它正常退出其入口点例程。尽管Cocoa,POSIX和Multiprocessing Services提供了直接杀死线程的例程,但强烈建议不要使用此类例程。

所以我认为我不应该杀死线程...但是如果他们在同步块上等待,我怎么能让它们正常退出?我是否必须编写自己的信号量来处理这种行为?

谢谢! 尼克。

2 个答案:

答案 0 :(得分:3)

这里要问的第一个问题 - 您是否需要大量的关键部分,以至于很多线程都在等待进入?你在这里做的是序列化并行执行,即再次使程序单线程(但速度较慢。)尽可能减少锁定范围,考虑减少应用程序级别的争用,使用适当的同步工具(等待/信号) - 你会发现你几乎不需要杀死线程。我知道这是一个非常普遍的建议,但这样做真的很有帮助。

答案 1 :(得分:2)

通常,您无法终止正在等待同步块的线程,如果您需要这种行为,您应该使用定时等待和信号范例,以便线程处于睡眠等待状态并且可以被中断。此外,如果您使用定时等待和信号范例,每次定时等待到期时您的线程都有机会不再回到睡眠状态而是退出或采取其他路径(即使您不选择终止它们) )。

同步块是针对无争议的锁而设计的,在无争议的锁上,同步应该非常接近noop,但是一旦锁变得有争议,它们对应用程序性能非常不利,甚至仅仅因为它们是序列化您的并行程序。

我无论如何都不是Objective C专家,但我确信有一些更先进的同步模式,如障碍,条件,原子等。