在 posix 线程上创建自动释放池

Posted

技术标签:

【中文标题】在 posix 线程上创建自动释放池【英文标题】:Create autorelease pool on posix thread 【发布时间】:2013-02-04 16:09:03 【问题描述】:

我正在使用GTMLogger 函数在我的应用程序中格式化日志记录。此应用程序创建实时 posix 线程(音频数据包处理)。有时我们需要从这些非 Cocoa 线程中执行日志记录。 GTMLogger 创建自动释放的对象,我想在函数中的 GTMLogger 调用上放置一个 @autoreleasepool 块,该函数来自非 Cocoa 线程的日志,但我担心它会影响性能。

我的问题是 - 我可以以某种方式创建自动释放池并将其与当前 posix 线程相关联,因此每个线程只创建一次池,而不是每次调用 log 函数时创建池?

提前致谢

【问题讨论】:

当你创建 pthread 时,你传递了一个方法来调用它,所以你不能把 @autoreleasepool 放在这个***方法中,就像 main.m 在 Xcode 生成的应用程序中一样? 这就是问题所在,线程不是在我的代码中创建的,而是在一些 3rd 方 SDK 库中创建的。实际调用这个函数的代码实际上并不知道它是从哪个线程调用的。 【参考方案1】:

在 ARC 下,使用 @autoreleasepool 非常快。如果您担心那里的性能,我会更担心首先避免不必要的日志记录调用,而不是自动释放池。

如果线程是长期存在的,您通常不能创建与“线程”相关联的池。您需要定期排空池,如果您只是将整个线程主函数括在 @autoreleasepool 或类似的任何内容中,则不会发生这种情况。

【讨论】:

赞成你的答案,你是对的,避免不必要的日志调用。【参考方案2】:

好吧,如果您无法控制线程的主函数,那么我想您能做的最好的事情就是将自动释放池放置在该库“调用”到您控制的代码中。

【讨论】:

我的函数是从音频流 posix 线程调用的。我担心的是在函数内容上创建自动释放池会影响音频质量。

以上是关于在 posix 线程上创建自动释放池的主要内容,如果未能解决你的问题,请参考以下文章

在没有池的情况下自动释放 - 没有启动新线程

具有大量自动释放对象的线程如果是/否,在这种情况下是不是必须使用自动释放池,为啥?

在自动释放池 内释放创建的自动释放对象 [关闭]

ios自动释放池

Iphone 打开 gl es 应用程序和自动释放池

iOS自动释放池_原理_如何工作