在 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 线程上创建自动释放池的主要内容,如果未能解决你的问题,请参考以下文章