2011-12-07 18 views
6

Ho appena compilato e installato clang + llvm 3.0 sulla mia ubuntu 10.04 e anche libC++ da svn. Poiché lo stato in libC++ mostra che il supporto per il thread è completo, volevo provare std :: async. Così seguo l'esempio dato da Anthony Williams nelstd :: async in clang 3.0 + libC++ non funziona?

http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html

e solo fare piccola modifica per rendere più compilare:

#include <future> 
#include <iostream> 

int calculate_the_answer_to_LtUaE() 
{ 
    return 42; 
} 

void do_stuff() 
{ 
    std::cout << "doing stuff" << std::endl; 
} 

int main() 
{ 
    std::future<int> the_answer=std::async(calculate_the_answer_to_LtUaE); 
    do_stuff(); 
    std::cout<<"The answer to life, the universe and everything is " 
    <<the_answer.get()<<std::endl; 
} 

E io compilo con

clang ++ --std = C++ 0x -stdlib = libC++ -lpthread async.cpp

Tuttavia, funziona e termina sempre con un core dump:

fare cose la risposta alla vita, l'universo e tutto viene interrotta (core dumped)

ho controllare il core dump e si vede pila come questo (che non mi riesce quasi mai un suggerimento)

 
#0 0x00007fd0a1a7ba75 in raise() from /lib/libc.so.6 
#1 0x00007fd0a1a7f5c0 in abort() from /lib/libc.so.6 
#2 0x00007fd0a22a735b in std::exception_ptr::~exception_ptr (this=) at ../src/exception.cpp:130 
#3 0x0000000000404178 in void std::__1::__assoc_state::set_value(int&&)() 
#4 0x00000000004051ae in _ZNSt3__119__async_assoc_stateIiNS_12__async_funcIPFivEJEEEE9__executeEv() 
#5 0x0000000000404e00 in _ZNSt3__114__thread_proxyINS_5tupleIJMNS_19__async_assoc_stateIiNS_12__async_funcIPFivEJEEEEEFvvEPS7_EEEEEPvSC_() 
#6 0x00007fd0a250f9ca in start_thread() from /lib/libpthread.so.0 
#7 0x00007fd0a1b2e70d in clone() from /lib/libc.so.6 
#8 0x0000000000000000 in ??() 

Qualcuno ha un'idea del perché?

+2

Un annullamento indica che un'asserzione non è riuscita. Esaminare assert() s in exception.cpp vicino alla riga 130. Si consiglia vivamente l'uso di gdb per interrompere l'interruzione e analizzare i locali. – moshbear

risposta

7

mi sono imbattuto il tuo esempio su OS X Lion, utilizzando:

clang++ -std=c++0x -stdlib=libc++ async.cpp 

E l'output del programma:

doing stuff 
The answer to life, the universe and everything is 42 

Ispezione della fonte di libC++ come suggerito dal commento di moshbear vedo:

exception_ptr::~exception_ptr() _NOEXCEPT 
{ 
#if HAVE_DEPENDENT_EH_ABI 
    __cxa_decrement_exception_refcount(__ptr_); 
#else 
    #warning exception_ptr not yet implemented 
    ::abort(); 
#endif // __APPLE__ 
} 

Mi sembra che ~exception_ptr() non sia stato portato su ubuntu 10.04. Questa è una funzione di basso livello non implementabile in C++ portatile. I lavori per la creazione di un'implementazione senza GPL di questo livello sono in corso allo libc++abi. Posso assicurarti che libC++ abi non è pronto per la prima serata in questo momento.

C'è stato anche uno sforzo indipendente in questa libreria di basso livello a: https://github.com/pathscale/libcxxrt. Non conosco lo stato di questa libreria né se sia stato trasferito su ubuntu.

Problemi correlati