Kurz gesagt ist, das Hinzufügen -pthread
löst Ihr Problem.
$ g++ -std=c++14 -g -pthread -o temp temp.cpp
$ ./temp
Einzelheiten
ich das Verhalten auf Ubuntu 16.04 mit folgendem Befehl zum Kompilieren reproduzieren kann:
$ 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 Dump zeigt:
(gdb) bt
#0 0x00007ffff74ab428 in __GI_raise ([email protected]=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
Von der Müllkippe Wir können sehen, dass es Stummschaltung verwendet x, etc. Dann merke ich, dass std::future
Zeug hängt von Thread, so muss es gegen pthread
verknüpfen, sonst sehen wir diese Ausnahme.
Das gleiche gilt für std::thread
@ vu1p3n0x ein leerer gemeinsamen Staat dürfen nicht zur Folge, dass die nächste get_future werfen. Es ist auch der set_value, der hier aus irgendeinem Grund wirft. – Curious
Setzen Sie einen Debugger auf die Sache und herauszufinden, was genau diese Ausnahme wirft. Es ist nichts falsch mit dem Code, und ich kann die gemeldete Ausnahme auf Wandbox GCC 5.4 nicht reproduzieren. –