即使我使用std :: future :: get,为什么我还需要加入一个线程?

时间:2015-12-22 08:49:45

标签: c++ multithreading

void
set_string(std::promise<std::string>& p)
{
  p.set_value("set from thread");
}

int
main()
{
  std::promise<std::string> p;
  std::future<std::string> f = p.get_future();
  std::thread t(&set_string, std::ref(p));
  std::cout << f.get() << std::endl;
  t.join();
}

为什么在拨打t.join()后需要致电f.get()?我认为f.get()将阻塞主线程,直到它可以获得结果,这意味着线程已经完成。

2 个答案:

答案 0 :(得分:2)

因为即使在线程完成执行后它仍然可以连接。您可以调用detach以允许独立执行。在这种情况下,您可能希望使用set_value_at_thread_exit的{​​{1}}成员来减少promise在线程之前完成的机会:

main

http://coliru.stacked-crooked.com/a/1647ffc41e30e5fb

答案 1 :(得分:2)

我认为线程的基本原理只是你要么明确地加入它们,要么你明确地将它们分离,但是如果一个线程对象在发生之前就被破坏了,你可能会遇到设计问题。决定不是假设您想要在调用析构函数时将其分离或加入它,因为在大多数情况下任何一个都是错误的猜测。

此外,关于您的情况,未来的确定位置并不重要。线程对象的要求并没有触及它如何触发未来,它们保持不变。

请注意,在您的情况下,由于您不再关心线程,您可以简单地将其分离。