2

我们正在编写一个带有大量后台处理的 iPad 应用程序,所有这些都是用一组 C++ 库编写的。这些库在 Linux、Mac 和 Windows 上运行良好,但在 iPad 上它们只能在调试版本中运行。

在发布版本中,看起来当第一个子线程被启动时,它要么从未真正启动,要么在处理过程中没有足够远以允许主线程继续(从调试器是否由于在发布版本中使用断点的正常问题导致线程实际上正在启动)。

在调试器中查看主线程所在的位置boost::thread::start_thread(实际上在里面boost::detail::yieldboost::detail::spin_lock::lock

CPU 未达到 100%,因此自旋锁似乎不会导致新线程的创建处于饥饿状态。

我们已经尝试过 Boost 1.42 和 Boost 1.44,它们的行为方式相同。iOS 3.2 和 4.2 都失败了发布版本。

我们可能做错了什么,或者这是一个已知的不工作配置?

4

1 回答 1

6

我们现在已经解决了这个问题。问题出在构建选项中,线索是自旋锁失败了。

事实证明,在非拇指构建中使用了自旋锁的 ARM 实现。由于拇指构建的方式,很容易混合拇指构建和非拇指构建(即,在没有拇指的情况下构建 Boost 并使用拇指构建 xCode)。这就是我们所做的,这意味着自旋锁永远不会收到信号,只会永远阻塞。

因此,要解决此问题,请确保您为所有库使用相同的拇指构建选项!

这个线程讨论了这个问题:http ://groups.google.com/group/boost-list/browse_thread/thread/7dc1e80659182ab3

于 2010-11-22T13:24:17.137 回答