如何检查线程是否已在 C 11 及更高版本中完成工作?

新手上路,请多包涵

如何检查线程是否已在 C++11 及更高版本中完成工作?我一直在阅读文档,并编写了以下代码:

 #include <iostream>
#include <thread>
void mythread()
{
    //do some stuff
}
int main()
{
  std::thread foo(mythread);
  if (foo.joinable())
  {
    foo.join();
    //do some next stuff
  }
}

joinable 只告诉线程已经开始工作,但我想知道如何编写代码来检查线程是否完成工作。

例如:

 #include <iostream>
#include <thread>
void mythread()
{
    //do some stuff
}
int main()
{
  std::thread foo(mythread);
  if (foo.finishedWork())
  {
    foo.join();
    //do some next stuff
  }
}

原文由 user2856064 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 525
1 个回答

您可能想要使用 std::future ,它提供了更高级别的工具,您可以在其中轻松检查异步计算是否完成(也就是准备好):示例:

 void mythread() {
    //do some stuff
}

template<typename T>
bool future_is_ready(std::future<T>& t){
    return t.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
}

int main()
{
    std::future<void> foo = std::async(std::launch::async, mythread);
    if (future_is_ready(foo)){
        //do some next stuff
    }
}


另一方面,您可能认为简单地使用“安全”(或原子)标志是可行的:

 #include <iostream>
#include <thread>

std::atomic<bool> is_done{false};

void mythread()
{
    //do some stuff
    ......
    is_done = true;
}
int main()
{
  std::thread foo(mythread);
  if (is_done)
  {
    foo.join();
    //do some next stuff
  }
  .....
  if(foo.joinable()) foo.join();
}

但是,它 不起作用。虽然您认为 is_done = true 是您在 mythread() 中所做的最后一件事;您可能已经在该范围内创建了一些具有 自动存储持续时间 的对象,并且由于这些对象以相反的构造顺序被销毁,因此在设置 is_done 之后,该线程中仍然会有“一些工作”。

原文由 WhiZTiM 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题