std :: promise :: get_future引发非法指令(SIGILL)

时间:2013-12-18 16:22:10

标签: c++ promise future googletest

这个非常基本的例子:

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)));

1 个答案:

答案 0 :(得分:0)

无论你是超时还是设定值,你都会遇到p被摧毁与在lambda中使用之间的竞争条件。

如果设置值,可以使用set_value_at_thread_exit来避免竞争条件,但这不会解决第一个问题。实际上,你不能完全解决第一个问题,因为如果函数没有返回,那个线程就会泄漏并挂起,并且线程没有给你一个避免它的选项。

您可以通过将promise(可能还有所有其他使用的对象)移动到线程构造函数中来缓解问题,而不是引用它们。