这个非常基本的例子:
std::promise<int> p;
std::future<int> f = p.get_future();
发出非法指令信号(SIGILL)。信号源自第463行:
__throw_future_error((int)future_errc::no_state);
为什么以及如何解决此问题?我在cppreference上找到了相同的例子。
背景:在我的一个测试中(我使用Googletest),我想检查方法调用是否终止。由于框架没有为此提供任何机制,我的想法是这样的:
std::promise<bool> p;
std::future<bool> f = p.get_future();
std::thread([](std::promise<bool>& finished, Foo*& foo) {
foo->bar();
p.set_value(true);
}, std::ref(p), std::ref(foo)).detach();
EXPECT_NE(std::future_status::timeout, f.wait_for(std::chrono::milliseconds(5000)));
答案 0 :(得分:0)
无论你是超时还是设定值,你都会遇到p
被摧毁与在lambda中使用之间的竞争条件。
如果设置值,可以使用set_value_at_thread_exit
来避免竞争条件,但这不会解决第一个问题。实际上,你不能完全解决第一个问题,因为如果函数没有返回,那个线程就会泄漏并挂起,并且线程没有给你一个避免它的选项。
您可以通过将promise(可能还有所有其他使用的对象)移动到线程构造函数中来缓解问题,而不是引用它们。