来自std :: promise的未知异常 [英] Unknown exception from std::promise
问题描述
以下代码有什么问题?在运行时,程序因未知异常中止
What is wrong with the following code? When ran the program aborts with an unknown exception
#include <iostream>
#include <future>
int main() {
auto promise = std::promise<int>{};
auto future_one = promise.get_future();
promise.set_value(1);
return 0;
}
错误输出为
terminate called after throwing an instance of 'std::system_error'
what(): Unknown error -1
Aborted (core dumped)
g ++ --version
给我
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
相同的代码在Mac上也能正常工作
The same code works just fine on a mac
注意异常所源自的代码行是 promise.set_value(1)
Note The line of code that the exception originates from is the promise.set_value(1)
推荐答案
简而言之,添加 -pthread
可解决您的问题。
In short, adding -pthread
resolves your issue.
$ g++ -std=c++14 -g -pthread -o temp temp.cpp
$ ./temp
Details
我可以在Ubuntu 16.04上重现该行为使用以下命令进行编译:
Details
I can reproduce the behavior on Ubuntu 16.04 with below command on compiling:
$ g++ -std=c++14 -g -o temp temp.cpp
$ ./temp
terminate called after throwing an instance of 'std::system_error'
what(): Unknown error -1
Aborted (core dumped)
GDB转储显示:
(gdb) bt
#0 0x00007ffff74ab428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007ffff74ad02a in __GI_abort () at abort.c:89
#2 0x00007ffff7ae484d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007ffff7ae26b6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4 0x00007ffff7ae2701 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5 0x00007ffff7ae2919 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6 0x00007ffff7b0b7fe in std::__throw_system_error(int) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7 0x000000000040259b in std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) (__once=...,
__f=<unknown type in /home/mine/tempdir/temp, CU 0x0, DIE 0xe578>) at /usr/include/c++/5/mutex:746
#8 0x0000000000401e06 in std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) (this=0x61ac30, __res=..., __ignore_failure=false) at /usr/include/c++/5/future:387
#9 0x0000000000402aee in std::promise<int>::set_value(int&&) (this=0x7fffffffe1c0, __r=<unknown type in /home/mine/tempdir/temp, CU 0x0, DIE 0xeb8a>) at /usr/include/c++/5/future:1075
#10 0x0000000000401759 in main () at temp.cpp:7
从转储中,我们可以看到它正在使用互斥锁等。
然后我意识到 std :: future
东西取决于线程,所以它需要链接到 pthread
,否则我们会看到此异常。
From the dump, we can see it's using mutex, etc.
Then I realize that std::future
stuff depends on thread, so it needs to link against pthread
, otherwise we see this exception.
对于<$ c $来说也是一样c> std :: thread
这篇关于来自std :: promise的未知异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!