Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何终止等待@synchronized objective C的线程_Objective C_Multithreading_Synchronization - Fatal编程技术网

Objective c 如何终止等待@synchronized objective C的线程

Objective c 如何终止等待@synchronized objective C的线程,objective-c,multithreading,synchronization,Objective C,Multithreading,Synchronization,我有一些这样的代码: doDatabaseFetch { ... @synchronized(self) { ... } } 以及许多在用户使用视图时调用doDatabaseFetch的对象 我的问题是,我有一个操作(导航到下一个视图)也需要数据库获取。我的问题是,它会碰到同一个同步块并等待轮到它!理想情况下,我希望这个操作能够杀死所有等待的线程,或者给这个线程一个更高的优先级,以便它能够立即执行 苹果说 建议退出线程的方法是让它正常退出其入口点例程。尽管Coco

我有一些这样的代码:

doDatabaseFetch {
   ...
   @synchronized(self) {
      ...
   }
}
以及许多在用户使用视图时调用doDatabaseFetch的对象

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

苹果说

建议退出线程的方法是让它正常退出其入口点例程。尽管Cocoa、POSIX和多处理服务提供了直接终止线程的例程,但强烈反对使用此类例程

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

谢谢!
尼克。

这里要问的第一个问题是——你需要这么多线程等待进入的关键部分吗?您在这里所做的是序列化并行执行,即使您的程序再次成为单线程(但速度较慢)。尽可能减少锁定范围,考虑在应用程序级别减少争用,使用适当的同步工具(等待/信号)-您将发现,您几乎不需要终止线程。我知道这是一个非常笼统的建议,但这样想确实很有帮助。

这里要问的第一个问题是——你需要这么多线程等待进入的关键部分吗?您在这里所做的是序列化并行执行,即使您的程序再次成为单线程(但速度较慢)。尽可能减少锁定范围,考虑在应用程序级别减少争用,使用适当的同步工具(等待/信号)-您将发现,您几乎不需要终止线程。我知道这是一个非常笼统的建议,但这样想确实很有帮助。

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

同步块是为无争用锁设计的,在无争用锁上,同步应该非常接近noop,但一旦锁有争用,它们就会对应用程序性能产生非常不利的影响,甚至不仅仅是因为它们正在序列化并行程序


无论如何,我不是一个客观的C专家,但我确信还有一些更高级的同步模式,如障碍、条件、原子等。

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

同步块是为无争用锁设计的,在无争用锁上,同步应该非常接近noop,但一旦锁有争用,它们就会对应用程序性能产生非常不利的影响,甚至不仅仅是因为它们正在序列化并行程序


无论如何,我不是一个客观的C专家,但我确信还有一些更高级的同步模式,如障碍、条件、原子等。

我完全同意——我想我是在序列化并行执行。事实上,我正在编写一个iPhone数据库访问层来访问sqlite,而该设备在执行数据库访问时相当慢——但我想我必须更加聪明;)我完全同意——我想我是在序列化并行执行。事实上,我正在编写一个iPhone数据库访问层来访问sqlite,而该设备在执行数据库访问时相当慢——但我想我必须更加聪明;)