2011-12-07 10 views
6

Acabo de compilar e instalé clang + llvm 3.0 en mi ubuntu 10.04, y también libC++ desde svn. Como el estado en libC++ muestra que el soporte de la secuencia está completo, quise probar std :: async. Así que yo sigo el ejemplo dado por Anthony Williams enstd :: async en clang 3.0 + libC++ no funciona?

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

Y acabo de hacer cambios menores a que se compile:

#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; 
} 

Y compilo con

sonido metálico ++ = c --std ++ 0x -stdlib = libC++ -lpthread async.cpp

Sin embargo, se ejecuta y siempre termina con un volcado del núcleo:

haciendo cosas La respuesta a la vida, el universo y todo lo que se aborta (core dumped)

puedo comprobar el vaciado de memoria y se nota como esta pila (que no acabo de obtener una pista)

 
#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 ??() 

Cualquiera tiene una idea de por qué?

+2

Un aborto significa que una afirmación ha fallado. Mire assert() s en exception.cpp cerca de la línea 130. Se recomienda encarecidamente usar gdb para interrumpir el aborto y analizar los locales. – moshbear

Respuesta

7

que corrió su ejemplo en OS X Lion, usando:

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

Y la salida del programa:

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

Inspección de la fuente de libC++ como se sugiere por el comentario de moshbear veo:

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__ 
} 

Me parece que ~exception_ptr() no se ha portado a ubuntu 10.04. Esta es una instalación de bajo nivel que no se puede implementar en C++ portátil. Se está trabajando en la creación de una implementación libre de GPL de este nivel en libc++abi. Puedo asegurarle que libC++ abi no está listo para el horario estelar en este momento.

También ha habido un esfuerzo independiente en esta biblioteca de bajo nivel en: https://github.com/pathscale/libcxxrt. No sé el estado de esta biblioteca ni si ha sido portada a ubuntu.

Cuestiones relacionadas