1

我正在尝试将 C 控制台程序移植到 iPhone。我已将所有代码导入到我的项目中,当用户单击 UI 上的按钮时,我在 NSOperation 中将其称为 main()。

无论如何,这个程序很复杂,并且创建了许多自己的线程。该程序也多次调用“exit()”——这会使整个 iPhone 应用程序崩溃,但我真的希望用户能够重新启动 C 程序,如果它这样做的话。

我一直在努力清理这些退出条件,并且在 C 程序创建的一些子线程中使用了 pthread_exit()。但是,当我在从 NSOperation 对象创建的线程中调用 pthread_exit() 时,应用程序的主线程得到一个 SIGABRT 信号,整个应用程序崩溃。

我是否正确评估了情况?我是 iOS 编程新手,所以这个信号可能来自其他地方......如果我是正确的,解决这个问题的最佳方法是什么?

(哦,关于使用“return 0”退出这个 NSOperation 线程:我想退出的条件嵌套在 C 程序函数的深处,我想尽可能避免改变程序的结构,因为它已经很复杂了)

提前感谢您的帮助!

4

2 回答 2

2

NSOperationQueue在 GCD 队列上执行它的操作。虽然这些线程在 pthreads 上执行他们的工作,但这些线程是 GCD 私有的,并且不允许您使用 pthread API 修改或退出它们。有关于Compatibility with POSIX Threads的文档,其中明确说明了允许哪些 pthread 函数,哪些不允许。

要解决您的问题,您可能不应该让您的 pthread 代码在 a 上运行,NSOperationQueue而是在您为此创建的新 POSIX 线程上运行。

于 2012-08-21T20:15:34.480 回答
1

不要杀死你的 pthreads - 让它们自然退出。同样,exit!= pthread_exit。作者在打电话时显然没有考虑清理exit。所以你真的只是通过杀死线程来吞下致命的错误。

如果它不能导致未定义的行为或其他令人讨厌的事情,如泄漏或死锁,那将是一个奇迹。

简而言之,图书馆被滥用了。如果您打算继续执行,您应该优雅地处理错误。这可能需要大量工作。

于 2012-08-21T20:34:13.480 回答