尝试启动 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::threads,并且只有在使用 UI 时我才开始看到这个崩溃。在您看来,分离线程可能会解决我看到的问题,即在启动此类线程时应用程序偶尔会崩溃?

以上是关于尝试启动 Boost 线程时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 Boost 序列化库时出错

尝试在 C++ 中使用 boost 正则表达式匹配从字符串转换为 int 时出错

LNK1104 将 Boost 库添加到 Qt 项目时出错

使用 boost io_service 初始化 boost udp 套接字时出错

boost 链接出错无法打开libboost_thread-vc140-mt-sgd

编译 sio 客户端时出错