繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM