【问题标题】:Is there an accepted way of either running a thread or executing sequentially?是否有一种可接受的方式来运行线程或按顺序执行?
【发布时间】: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


【解决方案1】:

构建就绪或运行异步任务的未来。

【讨论】:

    【解决方案2】:

    作为替代方案,std::future 可能会有所帮助,例如:

    std::future<void> fut;
    if (condition)
    {
        fut = std::async(std::launch::async, function);
    }
    else
    {
        fut = std::async(std::launch::deferred, function);
        fut.wait();
    }
    // some more code here
    fut.wait()
    

    【讨论】:

    • 这是否与调用thread = boost::thread(function) 然后在else 案例中立即添加thread.join() 相同?
    • async with std::launch::deferred 在线程中运行,当它被等待时
    • 不,thread.join() 阻止调用线程在创建的线程上等待
    • fut.wait() 不也是这样做的吗?根据this,它“阻塞直到结果可用。”
    • 这种混乱是我认为 Caleth 的答案更好的原因,因为它在顺序情况下避免了async,从而使发生的事情更加明显。如果您不想推迟执行,使用async(launch::deferred, ...) 很奇怪;只需运行该函数即可。
    【解决方案3】:

    使用期货的另一种看法

    std::future<void> fut;
    if (condition)
    {
        fut = std::async(std::launch::async, function);
    }
    else
    {
        function();
        std::promise<void> prom;
        fut = prom.get_future();
        prom.set_value();
      // or std::experimental::make_ready_future() if avaliable
    }
    // some more code here
    fut.wait()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2018-10-01
      相关资源
      最近更新 更多