【发布时间】:2018-08-22 19:44:46
【问题描述】:
由于我无法控制的原因,我必须编写代码来执行以下操作:
- 如果满足某个条件,则在单独的线程上执行该函数并等待它稍后在代码中完成。
- 否则,通过简单地调用函数而不使用新线程来顺序执行程序。
boost::thread thread;
if (condition)
{
thread = boost::thread(function);
}
else
{
function();
}
<some more code here>
thread.join();
有没有比上面的代码更好的方法?
不幸的是,我可以使用的解决方案非常有限,但欢迎提出任何建议/想法/意见。
【问题讨论】:
-
您的代码示例需要在
thread.join();之前说出if (thread.joinable()),否则在!condition时会抛出异常,因为您无法加入默认构造的线程。 -
查看我的编辑@Jonathan Wakely。在 if-else 情况之前,线程对象是默认构造的。根据 boost 文档,这应该创建一个 Not-a-Thread 对象,如果在这样的对象上调用
join(),它应该立即返回。虽然,我同意即使在这种情况下,添加 `if (thread,joinable()) 调用会使事情更清楚。 -
啊,显然
boost::thread::join()行为取决于是否定义了BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED宏。对于std::thread::join(),尝试加入不可加入的线程总是错误的。对于boost::thread,它是可配置的。
标签: c++ multithreading boost boost-thread