自动终止C ++ 11 STL线程

时间:2014-02-09 20:09:07

标签: c++ c++11

我希望STL线程在完成它应该做的事情后终止自己;还有,有什么方法可以知道线程何时完成?就像事件一样。

提前致谢。

4 个答案:

答案 0 :(得分:2)

线程将在它结束函数f后终止,并且:

void f()
{
    do_some_work();
    // end of function f
}

...
{
    ...
    std::thread t(f);
    do_some_other_work();
    t.join();
}

功能join - >阻止你的当前线程,直到线程t停止。

答案 1 :(得分:2)

如果您想要一种方法来轮询线程的完成状态而不是简单地使用join阻止,您可以使用async生成线程并轮询返回的futurewaiting以0超时完成:

void f() {
  std::this_thread::sleep_for(std::chrono::seconds{2});
}

int main() {
  auto const zero = std::chrono::seconds{0};
  auto result = std::async(std::launch::async, f);
  while (result.wait_for(zero) != std::future_status::ready) {
    std::cout << "I'm still waiting...\n" << std::flush;
    std::this_thread::sleep_for(std::chrono::milliseconds{100});
  }
  result.get();
  std::cout << "Done.\n";
}

答案 2 :(得分:1)

此操作称为joinhttp://www.cplusplus.com/reference/thread/thread/join/

调用时,当前线程将等待,直到另一个线程完成。就那么简单。没什么。

答案 3 :(得分:1)

像svetlovva和quetzalcoatl所说:使用连接操作确保线程完成。

但是如果你想知道线程何时完成,而不使用阻塞连接操作,你可以分离一个线程并使用一些全局变量检查线程是否存活。 伪代码:

std::atomic<bool> imdone;

void myThreadfunction() {
    //dosomestuff;
    imdone = true;
    return;
}

int main() {
    imdone = false;
    std::thread t1(myThreadfunction);
    t1.detach();

    //dosomeotherstuff

    while(!imdone) {
        //dosomeotherstuffwhilethreadisrunning
    }
}

但是对于你想独立运行的每个线程使用全局变量并不是很好......