[英]std::promise::get_future raises illegal instruction (SIGILL)
这个非常基本的例子:
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)));
无论您超时还是设置该值,您都在p
被销毁和其在lambda中的使用之间存在竞争条件。
在设置值的情况下,可以通过使用set_value_at_thread_exit
避免竞争条件,但这不能解决第一个问题。 实际上,您无法完全解决第一个问题,因为如果该函数不返回,该线程将泄漏并挂起,并且线程没有为您提供避免这种情况的选择。
您可以通过将promise(以及可能使用的所有其他对象)移到线程构造函数中,而不是引用它们来减轻问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.