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

C++ std::promise::get_future引发非法指令(SIGILL),c++,promise,future,googletest,C++,Promise,Future,Googletest,这是一个非常基本的例子: std::promise<int> p; std::future<int> f = p.get_future(); 为什么以及如何修复此问题?我在网上找到了同样的例子 背景:在我的一个测试中(我使用Googletest),我想检查一个方法调用是否终止。由于框架没有为此提供任何机制,我的想法是这样的: std::promise<bool> p; std::future<bool> f = p.get_future(); s

这是一个非常基本的例子:

std::promise<int> p;
std::future<int> f = p.get_future();
为什么以及如何修复此问题?我在网上找到了同样的例子

背景:在我的一个测试中(我使用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)));
std::promise p;
std::future f=p.get_future();
std::thread([](std::promise&finished,Foo*&Foo){
foo->bar();
p、 设置_值(真);
},std::ref(p),std::ref(foo)).detach();
EXPECT_NE(std::future_status::timeout,f.wait_for(std::chrono::毫秒(5000));

无论您是超时还是设置该值,都会在
p
被销毁和它在lambda中的使用之间存在竞争条件

在设置值的情况下,可以通过在线程退出时使用
set\u value\u来避免争用条件,但这并不能解决第一个问题。事实上,您无法完全解决第一个问题,因为如果函数不返回,该线程将泄漏并挂起,而线程不会给您避免该问题的选项


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

您应该深入调试器,通过查看反汇编来确定它是哪条指令。只有这样我们才能说得更多。这可能与windows 8.1无法在该机器上工作的原因相同。
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)));