2013-04-03 11 views
17

Questo codice è valido o il mio compilatore è rotto?È std :: promise broken sulla mia macchina (usando g ++ - mp)?

#include <future> 
#include <iostream> 

int main() { 
    std::cout << "doing the test" << std::endl; 
    std::promise<bool> mypromise; 
    std::future<bool> myfuture = mypromise.get_future(); 
    mypromise.set_value(true); 
    bool result = myfuture.get(); 
    std::cout << "success, result is " << result << std::endl; 
    return 0; 
} 

ecco l'output:

$ g++-mp-4.8 -std=c++11 test.cpp 
$ ./a.out 
doing the test 
Segmentation fault: 11 
$ 

sto usando g ++ - mp-4.8, che è il gcc 4.8 da MacPorts.

Sto impazzendo?

+0

Beh, si blocca in Ideone così: http://ideone.com/wNsr1h. Non conosco queste librerie molto bene, ma suppongo che questo non sia probabilmente il modo giusto per usarle. – templatetypedef

+0

Nessun segfault su Linux/g ++ - 4.7.2, ma invece 'std :: system_error' viene lanciato. –

+0

Funziona bene anche su stacked-crooked.com: http://coliru.stacked-crooked.com/view?id=df733168554395fe0d5e28982f5b4899-61c3814520a8d4318f681038dc4b4da7 – Nawaz

risposta

1

Il linker dinamico può essere collegando il vostro programma per una vecchia versione di libstdc++, quello in /opt/local/lib/libstdc++.6.dylib

Dal momento che si sta compilando con GCC 4.8 è necessario utilizzare il nuovo libstdc++ che viene fornito con GCC 4.8, che è probabilmente /opt/local/lib/gcc48/libstdc++.6.dylib

È necessario verificare se /opt/local/lib/libstdc++.6.dylib è la libreria fornita con GCC 4.8 e utilizzare quella corretta se non lo è.

È possibile controllare che in vari modi, il più semplice (ma non necessariamente il migliore) sarebbe di fare funzionare:

export DYLD_LIBRARY_PATH=/opt/local/lib/gcc48/ 
./a.out 

Vedi http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths e http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dynamic_or_shared.html#manual.intro.using.linkage.dynamic per altre informazioni (che non è specifico per Mac OS X)

+0

No luck = \ Infatti ho quella cartella, ma fare quella riga di esportazione prima di ./a.out non ha comportato cambiamenti. Ho anche provato questa linea prima della chiamata g ++ - mp-4.8, ma non ci sono modifiche neanche ... – Verdagon

1

Il codice viene compilato e funziona correttamente per me in Xcode. L'uscita è

fare il successo di prova , risultato è 1

Il compilatore è Apple LLVM 4.2

Quindi, vi suggerisco di avere un problema di configurazione del compilatore

+0

Hai C++ 11 per lavorare in xcode? Il motivo per cui sto usando g ++ - mp-4.8 è che non ho potuto farlo funzionare. Puoi indicarmi dove hai imparato come configurare xcode per C++ 11? – Verdagon

+0

OK: per prima cosa sto usando XCode 4.6. Non riesco a ricordare esattamente dove ho trovato le istruzioni, ma andare su Build Options-> Compiler: impostalo su Apple LLVM compilatore 4.2. Quindi vai a C++ Language Dialect e seleziona GNU ++ 11 [-std = gnu ++ 11] –

+0

Apparentemente la risposta è sbagliata. GCC 4.2 (Apple o altri tipi di supporto non supporta il futuro/asincrono). Il nuovo Xcode dovrebbe essere in grado di compilare il codice, usando clang e libC++. –

0

confermato: il codice produce il stesso problema qui:

compilatore: g++ -v

Using built-in specs. 
COLLECT_GCC=/opt/local/bin/g++-mp-4.8 
COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/x86_64-apple-darwin12/4.8.1/lto-wrapper 
Target: x86_64-apple-darwin12 

Configurato con: ../gcc-4.8-20130328/configure --prefix =/opt/local --build = x86_64-apple-darwin12 --enable-languages ​​= c, C++, objc, obj- C++, fortran, java --libdir =/opt/local/lib/gcc48 --includedir =/opt/local/include/gcc48 --infodir =/opt/local/share/info --mandir =/opt/local/condividi/man --datarootdir =/opt/local/share/gcc-4.8 --with-local-prefix =/opt/local --with-system-zlib --disable-nls --program-suffix = -mp- 4.8 --with-gxx-include-dir =/opt/local/include/gcc48/C++/--with-gmp =/opt/local --with-mpfr =/opt/local --with-mpc =/opt/local --with-ppl =/opt/local --with-cloog =/opt/local --enable-cloog-backend = isl --disable-cloog-version-check --enable-stage1-checking --disable -multilib --enable-lto --enable-libstdcxx-time --with-as =/opt/local/bin/as --with-ld =/opt/local/bin/ld --with-ar =/opt/local/bin/ar --with-bugurl = https://trac.macports.org/newticket --with-pkgver Sion = 'MacPorts gcc48 4.8-20130328_0'

Thread model: posix 
gcc version 4.8.1 20130328 (prerelease) (MacPorts gcc48 4.8-20130328_0) 

esecuzione in gdb dà:

doing the test 

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: 13 at address: 0x0000000000000000 
0x0000000100081c30 in __once_proxy() 
(gdb) up 
#1 0x00007fff8872fff0 in pthread_once() 
(gdb) up 
#2 0x0000000100000fd2 in __gthread_once() 
(gdb) up 
#3 0x00000001000020c9 in _ZSt9call_onceIMNSt13__future_base11_State_baseEFvRSt8functionIFSt10unique_ptrINS0_12_Result_baseENS4_8_DeleterEEvEERbEIKPS1_St17reference_wrapperIS8_ESF_IbEEEvRSt9once_flagOT_DpOT0_() 
(gdb) up 
#4 0x0000000100001886 in std::__future_base::_State_base::_M_set_result() 
(gdb) up 
#5 0x00000001000025ef in std::promise<bool>::set_value() 
(gdb) up 
#6 0x000000010000119f in main() 

quindi questo sembra un po 'di bug in libstdC++. Btw, usando clang 3.2 (homebrew), questo compila & funziona bene (result is 1). Forse dovresti presentare un bug report con bugzilla ...

0

Se non si dispone di usare GCC, la versione più recente delle opere compilatore di Apple . Assicurati di installare l'ultimo Xcode e anche gli "strumenti da riga di comando" all'interno di Xcode.

La riga di comando dovrebbe essere:

clang++ -std=c++11 -stdlib=libc++ -pthread test.cpp

Problemi correlati