std: async in clang 3.0 + libc ++ werkt niet?

Ik heb zojuist clang + llvm 3.0 gecompileerd en geïnstalleerd op mijn ubuntu 10.04, en ook libc ++ van svn. Omdat de status in libc ++ aangeeft dat threadondersteuning compleet is, wilde ik std: async proberen. Dus ik volg het voorbeeld gegeven door Anthony Williams in

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

En maak een kleine wijziging om het te laten compileren:

#include 
#include 

int calculate_the_answer_to_LtUaE()
{
  return 42;
}

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

int main()
{
  std::future 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()<

En ik compileer met

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

Het draait echter altijd en eindigt altijd met een core dump:

dingen doen Het antwoord op het leven, het universum en alles is afgebroken (kern gedumpt)

Ik controleer de core dump en deze toont stack op deze manier (die ik niet helemaal een hint krijg)

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

Heeft iemand een idee waarom?

6
Een afbreken betekent dat een bewering mislukt is. Kijk naar assert() s in exception.cpp bij regel 130. Gebruik van gdb om af te breken en de lokale bevolking te analyseren wordt sterk aanbevolen.
toegevoegd de auteur moshbear, de bron

1 antwoord

Ik heb het goede voorbeeld gegeven over OS X Lion, met behulp van:

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

En de uitvoer van het programma:

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

Inspecteer de bron van libc ++ zoals gesuggereerd door de opmerking van moshbear zie ik:

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

Het lijkt mij dat ~ exception_ptr() niet geporteerd is naar ubuntu 10.04. Dit is een low-level faciliteit die niet kan worden geïmplementeerd in draagbare C ++. Er wordt gewerkt aan het maken van een GPL-vrije implementatie van dit niveau op libc ++ abi . Ik kan je verzekeren dat libc ++ abi op dit moment niet klaar is voor prime time.

Er is ook een onafhankelijke inspanning geleverd in deze bibliotheek op het laagste niveau op: https://github.com/pathscale/libcxxrt . Ik ken de status van deze bibliotheek niet en ook niet of deze is geport naar ubuntu.

7
toegevoegd