关于 iPhone 上的多线程

Posted

技术标签:

【中文标题】关于 iPhone 上的多线程【英文标题】:Regarding multiple threads on the iPhone 【发布时间】:2011-03-27 17:55:08 【问题描述】:

我有一个问题。我的案例研究是我有两个大型 SQLite 数据库,我想使用线程(意味着同时有 2 个进程)。它运作良好吗?我写了以下代码:

NSAutoreleasePool *dbPool;

dbPool = [[NSAutoreleasePool alloc] init];

/* All Database work is performed here */

[dbPool release];

请指导我。我这样做是否正确?我应该使用水池来排水还是放水?

这样是不是使用并发进程,这意味着它也与多任务处理相同?

提前致谢!

【问题讨论】:

【参考方案1】:

是的,你做得对。您的每个新线程都需要自己的自动释放池。

关于您关于释放/排放池的问题,建议使用排放消息。

sqlite 数据库是什么意思?你如何访问它?如果您通过 CoreData 访问它,您的记忆中就会有以下内容:

每个线程需要一个 NSManagedObjectContext, 不要将 NSManagedObjects 传递给另一个线程,只传递对象 ID, 在将对象 ID 传递给另一个线程之前,请将其保存在传递之前修改/创建的线程中。

还有更多规则,但这些是基本规则。

多任务处理意味着您可以一次运行多个应用程序。多线程(=您的情况)意味着您的应用程序确实使用更多线程来完成其任务。

【讨论】:

【参考方案2】:

用户界面或其他繁重对象管理工作的常用方法是像您正在做的那样围绕您的代码,但您应该使用drain

NSAutoreleasePool *dbPool = [[NSAutoreleasePool alloc] init];

// do your work

[dbPool drain];

NSAutoreleasePool 的很多细节都可以在here 和以前的 Stack Overflow 答案here 中找到。基本上,如果设置为autorelease,您在池中所做的工作将在池耗尽后被释放。当使用某些生成自动释放实例的类时,这可以提高性能。但是,如果您想要完全和直接的控制,您可以 release 每个您正在使用的对象,一旦不再需要它并完全放弃池。

至于您的多线程问题,我不确定我是否理解您的要求,但是即使在后台线程中,使用池也是一种可靠的方法。这是假设您在线程中使用的对象不会以某种方式也在另一个线程中使用(因为您可能会意外释放)。

【讨论】:

如果他只使用 iPhone,他可以使用其中任何一个。如果释放池导致它被dealloc,dealloc方法无论如何都会调用drain。 @occulus :根据 Apple 指南,“您通常应该使用 drain 而不是 release”,只是为了模式,我想说。

以上是关于关于 iPhone 上的多线程的主要内容,如果未能解决你的问题,请参考以下文章

Java的多线程 简单入门

关于Java的多线程

关于C#的多线程方面

Windows IoT 上的多线程导致线程关闭

Elastic Beanstalk 上的 Tomcat - Tomcat 线程中的多线程

双核cpu上的多线程