尝试启动 Boost 线程时出错
Posted
技术标签:
【中文标题】尝试启动 Boost 线程时出错【英文标题】:Error when trying to start Boost thread 【发布时间】:2012-09-11 14:10:07 【问题描述】:我在我的 iPhone 应用程序中使用 Boost 线程已有一段时间了,但偶然发现了一个问题。每隔一段时间,当应用程序尝试启动这样的线程时,它会在尝试调用start_thread()
时抛出错误,然后应用程序崩溃。
我真的不知道从哪里开始调试它——从调试器看来,为什么不能初始化 boost 线程似乎并不明显。需要注意的是,这只发生在应用程序运行了一段时间,并且已经成功启动了几个线程之后。
我最近一直在处理 UI,我一直在使用以下命令来确保 UI 的每次更新都会在被调用时立即进行:
[myViewController performSelectorOnMainThread : @ selector(show_myButton) withObject:nil waitUntilDone:YES];
虽然该命令似乎有效,并且 UI 会立即更新(在它被延迟之前),但我担心它可能是我遇到的 boost 线程问题的原因。听起来可能吗?有没有人经历过这样的事情,并且对可能出现的问题有任何建议?
这是用于启动线程的代码:
void ObjectiveCPlusPlusInterface::startMyThread(void* a, myObject* b)
boost::thread AVPlayerThread = boost::thread(&ObjectiveCPlusPlusInterface::myThreadFunction, this, a, b);
(其中 a & b 是变量)
void ObjectiveCPlusPlusInterface::myThreadFunction(void* a, myObject* b)
...
如您所见,startMyThread()
尝试启动一个 boost 线程,该线程执行函数 myThreadFunction()
。但是,没有达到myThreadFunction()
,因为启动 boost 线程会引发错误。
【问题讨论】:
您能否发布包含创建线程的代码,直到加入它? (省略不相关的中间代码。) 另外,看看this question,你确定你在捕捉异常吗? 谢谢 - 我现在已经添加了代码。至于捕获异常,不,我不确定我是否正在这样做 - 而且,看看你下面的答案,我不完全明白如何做到这一点。你能给我一些建议吗? 【参考方案1】:查看at the manual,我们看到boost::thread
构造函数可以抛出异常。请务必检查:
try
boost::thread AVPlayerThread(&ObjectiveCPlusPlusInterface::myThread, this, a, b);
AVPlayerThread.detach(); // or join()?
catch (boost::thread_resource_error const &)
// resource error (print a diagnostic!)
catch (...)
// some other exception (print a diagnostic!)
更新:在您编辑后,我看到您没有加入或分离线程!这是不允许的。
您可以将上面的整个块直接放在您的 startMyThread
函数中。
【讨论】:
谢谢。你能给我一些关于如何在我的代码中实现它的建议吗?我以前没有用过这样的东西。另外,我目前没有join()
或detach()
电话。我是否认为join()
将意味着主线程等待提升线程返回?如果是这样,那不符合我的目的。是detach()
,那我应该用什么?
@user1295558:正确,join()
将阻塞直到线程函数返回。 detach()
将使线程无限期地运行。我已经更新了帖子,以便您可以将其粘贴到您的函数中。
谢谢。我在初始化后分离了线程,并放入了您推荐的捕获器。由于我进行了更改,因此该错误尚未发生,但是由于之前只是偶尔发生,因此很难判断问题是否已解决。我会继续测试,看看它是否会重新出现。您是否认为,在建议我分离线程时,这可能是我的问题的解决方案?
@user1295558:您必须分离或加入您开始的每个boost::thread
;否则你的程序有未定义的行为(即被破坏)。这不是选择的问题!
太好了,谢谢。我认为一切都很好,因为我的应用程序工作了很长时间而没有分离boost::thread
s,并且只有在使用 UI 时我才开始看到这个崩溃。在您看来,分离线程可能会解决我看到的问题,即在启动此类线程时应用程序偶尔会崩溃?以上是关于尝试启动 Boost 线程时出错的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 C++ 中使用 boost 正则表达式匹配从字符串转换为 int 时出错
使用 boost io_service 初始化 boost udp 套接字时出错