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()
将阻塞主线程,直到它可以获得结果,这意味着线程已经完成。
答案 0 :(得分:2)
因为即使在线程完成执行后它仍然可以连接。您可以调用detach
以允许独立执行。在这种情况下,您可能希望使用set_value_at_thread_exit
的{{1}}成员来减少promise
在线程之前完成的机会:
main
答案 1 :(得分:2)
我认为线程的基本原理只是你要么明确地加入它们,要么你明确地将它们分离,但是如果一个线程对象在发生之前就被破坏了,你可能会遇到设计问题。决定不是假设您想要在调用析构函数时将其分离或加入它,因为在大多数情况下任何一个都是错误的猜测。
此外,关于您的情况,未来的确定位置并不重要。线程对象的要求并没有触及它如何触发未来,它们保持不变。
请注意,在您的情况下,由于您不再关心线程,您可以简单地将其分离。