I just compiled and installed clang+llvm 3.0 on my ubuntu 10.04, and also libc++ from svn. As the status in libc++ shows thread support is complete, I wanted to try std::async. So I follow the example given by Anthony Williams in
http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html
And just make minor change to make it 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;
}
And I compile with
clang++ --std=c++0x -stdlib=libc++ -lpthread async.cpp
However, it runs and always finish with a core dump:
doing stuff The answer to life, the universe and everything is Aborted (core dumped)
I check the core dump and it shows stack like this (which I don't quite get a hint)
#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 ?? ()
Anybody has an idea why?
I ran your example on OS X Lion, using:
clang++ -std=c++0x -stdlib=libc++ async.cpp
And the program output:
doing stuff
The answer to life, the universe and everything is 42
Inspecting the source of libc++ as suggested by moshbear's comment I see:
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__
}
It appears to me that ~exception_ptr()
has not been ported to ubuntu 10.04. This is a low-level facility not implementable in portable C++. Work on creating a GPL-free implementation of this level is ongoing at libc++abi. I can assure you that libc++abi is not ready for prime time at this time.
There has also been an independent effort at this low-level library at: https://github.com/pathscale/libcxxrt . I do not know the status of this library nor whether it has been ported to ubuntu.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With