Boost.Thread 线程在发布版本中未在 iPhone/iPad 上启动

Posted

技术标签:

【中文标题】Boost.Thread 线程在发布版本中未在 iPhone/iPad 上启动【英文标题】:Boost.Thread threads not starting on the iPhone/iPad in release builds 【发布时间】:2011-05-11 05:14:04 【问题描述】:

我们正在编写一个带有大量后台处理的 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 都失败了发布版本。

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

【问题讨论】:

【参考方案1】:

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

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

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

本帖讨论问题:http://groups.google.com/group/boost-list/browse_thread/thread/7dc1e80659182ab3

【讨论】:

以上是关于Boost.Thread 线程在发布版本中未在 iPhone/iPad 上启动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse 中使用 MinGW 编译 boost 线程?

c++ boost thread_group with asycron 返回

线程 C++ 上的用户 I/O

在 boost::thread 线程中使用异常

boost::thread 的线程管理和并行性

MFC 多线程:AfxBeginThread 与 Boost.Thread?