2017-05-12 14 views
5

Aşağıdaki kodda sorun nedir? Program, bilinmeyen bir istisna ile iptal koştuğunda banastd :: promise bilinmeyen bir özel durum

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. 

aynı kod, bir mac gayet güzel çalışıyor verir için

#include <iostream> 
#include <future> 

int main() { 
    auto promise = std::promise<int>{}; 
    auto future_one = promise.get_future(); 
    promise.set_value(1); 

    return 0; 
} 

hata çıkışı

terminate called after throwing an instance of 'std::system_error' 
    what(): Unknown error -1 
Aborted (core dumped) 

g++ --version olduğunu


Not istisna Kısacası promise.set_value(1)

+0

için

aynı vu1p3n0x @ boş paylaşılan durum önümüzdeki get_future atmak olacağını ima edilmemelidir. Ayrıca bir sebepten dolayı buraya atanan set_value değeri de var .. – Curious

+0

Bir hata ayıklayıcısını üzerine koyun ve bu istisnayı ne attığını kesin olarak anlayın. Kodda yanlış bir şey yok ve Wandbox'ın GCC 5.4'ünde bildirilen istisnayı yeniden oluşturamıyorum. –

cevap

6

olduğunu kaynaklanan kod satırı, -pthread ekleyerek sorunu çözer.

$ g++ -std=c++14 -g -pthread -o temp temp.cpp 
$ ./temp 

Detaylar

Ben derleme üzerinde komuta altında olan Ubuntu 16.04 üzerinde davranışı üretebilir

:

$ 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 dökümü gösterileri:

(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 

dökümü itibaren Sessiz kullanarak görebiliyoruz x, etc. O zaman, std::future maddesinin iş parçacığına bağlı olduğunu anlıyorum, bu yüzden pthread ile bağlantı kurması gerekiyor, aksi halde bu özel durumu görüyoruz. std::thread

+0

Vay, birçok sistemde '-pread 'bayrağına ihtiyacın olduğunu hatırlamalıydım – Curious