如果加载dylib,垃圾收集工作队列崩溃

RLT*_*RLT 12 macos garbage-collection pthreads objective-c osx-mountain-lion

我们正在将应用程序从10.6移植到10.8.我正在看我们在app中加载的dylib.我在垃圾收集工作队列中面临非常不寻常的崩溃,并带有以下消息.

malloc: Thread::suspend():  unable to suspend a thread:  err = 268435459, Thread 0x111000000: _pthread = 0x108129000, _thread = 0x8b07, _stack_base = 0x108129000, enlivening  on, 0 local blocks
Run Code Online (Sandbox Code Playgroud)

为应用程序GCC_ENABLE_OBJC_GC = required设置.如果我GCC_ENABLE_OBJC_GC = required在dylib中它仍然会崩溃.我不能在应用程序中关闭垃圾收集器.我必须从我的dylib管理崩溃.

崩溃的原因原因是垃圾收集器无法挂起线程.(正如它在日志中所说).该线程使用thread_create()创建.如果我在dylib的构造函数中放置一个无限期的while循环(带睡眠),我就不会崩溃.构造函数完成执行后,我崩溃了.

他们是一种告诉垃圾收集器不要尝试暂停线程的方法吗?或者增加线程的引用次数?或者我可以做的任何事情来阻止垃圾收集器不干扰我的dylib代码.

Jea*_*ean -1

我们正在将应用程序从 10.6 移植到 10.8。崩溃的原因是垃圾收集器无法挂起线程。

这是预料之中的。
从 OSX 10.8 开始,垃圾收集已被弃用。因此CG无法挂起线程来执行其职责。结果,您会遇到所面临的所有问题。

如果您想针对 10.8 进行开发,则需要转换为 ARC(最佳)或返回到手动引用计数。如果您希望迁移到 arc,请参阅过渡到 ARC 发行说明


来自Apple文档中关于10.8的信息:

重要提示:从 OS X v10.8 开始,垃圾回收已被弃用。请改用 ARC(自动引用计数)。要了解有关 ARC 的更多信息,请参阅过渡到 ARC 发行说明。

资料来源:OS X v10.8 Mountain Lion 中的新增功能

答案:

  • 他们是告诉垃圾收集器不要尝试挂起线程的方法吗?

不,这就是它的工作原理。

  • 或者增加线程的引用计数?或者我可以做任何事情来阻止垃圾收集器不干扰我的 dylib 代码。

不可以。由于 GC 在 10.8 下已被弃用,因此如果您希望支持 10.8,则必须摆脱它。

GC 在 MAC 平台上确实是一项短命的技术。并因各种原因被ARC取代。