Boost.Thread线程在发布版本中不在iPhone/iPad上启动
问题描述:
我们正在编写一个iPad应用程序,其中有相当多的后台处理,所有这些都是用一组C++库编写的。这些库在Linux,Mac和Windows上运行良好,但在iPad上它们只能用于调试版本。Boost.Thread线程在发布版本中不在iPhone/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都会因发布版本而失败。
我们可能做错了什么,或者这是一个已知的非工作配置?
答
我们现在已经解决了这个问题。问题在于构建选项,并且线索是失败的自旋锁。
事实证明,在非拇指构建中使用了自旋锁的ARM实现。由于拇指构建完成的方式,很容易混合拇指和非拇指构建(即,不用拇指构建Boost,并用拇指构建xCode)。这就是我们正在做的事情,这意味着旋转锁永远不会得到信号,并会永远阻止。
因此,要解决这个问题,请确保您为所有库使用相同的拇指构建选项!
此线程讨论问题:http://groups.google.com/group/boost-list/browse_thread/thread/7dc1e80659182ab3