我们正在编写一个具有大量后台处理功能的iPad应用程序,所有这些都是用一组C ++库编写的。这些库在Linux,Mac和Windows上运行良好,但在iPad上它们只能在调试版本中运行。
在发布版本中,看起来当第一个子线程正在旋转时,它从未实际启动,或者它在处理过程中得不到足以让主线程继续运行(它不是很从调试器中可以看出,如果线程实际上是否正在启动,则由于在发布版本中使用断点的正常问题)。
在调试器中查看主线程位于boost::thread::start_thread
(实际位于boost::detail::yield
内的boost::detail::spin_lock::lock
内)。
CPU不是100%,因此旋转锁似乎不会创建新线程。
我们尝试过Boost 1.42和Boost 1.44,他们的行为方式相同。 iOS 3.2和4.2都在发布版本中失败。
我们可能做错了什么,或者这是一个已知的无效配置?
答案 0 :(得分:6)
我们现在已经解决了这个问题。问题在于构建选项,并且线索是失败的自旋锁。
事实证明,有一个自旋锁的ARM实现,用于非拇指构建。由于完成拇指构建的方式,很容易混合拇指和非拇指构建(即,不用拇指构建Boost并用拇指构建xCode)。这就是我们正在做的事情,这意味着自旋锁永远不会被发出信号,只会永远阻止。
因此,要解决此问题,请确保您为所有库使用相同的拇指构建选项!
此主题讨论了问题:http://groups.google.com/group/boost-list/browse_thread/thread/7dc1e80659182ab3