#include <iostream>
#include <string>
#include <thread>
#include <future>
int main()
{
auto pms = std::promise<std::string>();
auto ftr = pms.get_future();
std::thread([&](){pms.set_value("hello world");});
ftr.wait();
std::cout << ftr.get() << std::endl;
return 0;
}
根据this link,std::future::wait
会阻止,直到结果变得可用。
但是,上面的代码无法打印任何内容。显然主线程已经在pms.set_value
的线程完成之前完成。
为什么ftr.wait()
没有阻止?
答案 0 :(得分:9)
问题不在于std::future::wait
没有阻止。真正的问题是你在产生的线程,做它的工作以及主线程中std::thread
(临时)对象的破坏之间存在竞争条件。
因此,如果线程仍然可以连接,则在abort
的析构函数中调用std::thread
。
工作代码:
#include <iostream>
#include <string>
#include <thread>
#include <future>
#include <chrono>
int main()
{
auto pms = std::promise<std::string>();
auto ftr = pms.get_future();
std::thread thread ([&](){pms.set_value("hello world");});
ftr.wait();
std::cout << ftr.get() << std::endl;
thread.join ();
return 0;
}
注意,如果您未明确加入thread
,您仍然会遇到相同的竞争条件(因为main
可以更快地完成其工作, thread
可以自我清理。
演示工作示例:here。
答案 1 :(得分:1)
或者,您可以分离线程并使用promise::set_value_at_thread_exit
而不是set_value
#include <iostream>
#include <string>
#include <thread>
#include <future>
#include <chrono>
int main()
{
auto pms = std::promise<std::string>();
auto ftr = pms.get_future();
std::thread([&](){pms.set_value_at_thread_exit("hello world");}).detach();
ftr.wait();
std::cout << ftr.get() << std::endl;
return 0;
}