2009-05-21 60 views
0

我有一些像这样的代码:如何终止线程等待@synchronized目标C

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

,并调用doDatabaseFetch为用户使用视图许多对象。

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

苹果表示,

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

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

谢谢! Nick。

回答

3

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

+0

我会完全一致 - 我想我我正在序列化并行执行。实际上,我正在编写一个iPhone数据库访问层,用于访问sqlite,并且该设备在执行数据库访问时相当慢 - 但我想我只需要更聪明;) – 2009-05-26 10:39:30

2

通常情况下,您不能终止等待同步块的线程,如果您需要这种行为,您应该使用定时等待和信号范例,以便线程听起来很熟睡并可以中断。此外,如果您使用定时等待和信号范例,则每当定时等待过期时,您的线程都有机会不回到睡眠状态,而是退出或采取其他路径(即,即使您不选择终止它们)。

同步块是为无争议的锁设计的,在无争议的锁上,同步应该非常接近noop,但只要锁受到争议,它们对应用程序性能就会非常不利,甚至不仅仅是因为它们正在序列化你的并行程序。

我不以任何方式的目标C的专家,但我敢肯定,有一些更先进的同步模式,如屏障,条件,原子能等