std::async в clang 3.0 + libC++ не работает?
Я только что скомпилировал и установил clang+llvm 3.0 на мою Ubuntu 10.04, а также libC++ из SVN. Поскольку состояние в libC++ показывает, что поддержка потоков завершена, я хотел попробовать std:: async. Поэтому я следую примеру Энтони Уильямса в
И просто внесите небольшие изменения, чтобы он скомпилировался:
#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;
}
И я собираю с
clang++ --std= C++0x -stdlib=libC++ -lpthread async.cpp
Тем не менее, он работает и всегда заканчивается дампом ядра:
делать вещи Ответ жизни, вселенной и всему прерван (ядро сброшено)
Я проверяю дамп ядра, и он показывает стек вот так (на что я не совсем понимаю подсказку)
# 0 0x00007fd0a1a7ba75 в повышение () из /lib/libc.so.6 #1 0x00007fd0a1a7f5c0 в abort () из /lib/libc.so.6 #2 0x00007fd0a22a735b в std::exception_ptr::~exception_ptr (this=) в../src/exception.cpp:130 #3 0x0000000000404178 в void std::__1::__assoc_state::set_value(int&&) () #4 0x00000000004051ae в _ZNSt3__119__async_assoc_stateIiNS_12__async_funcIPFivEJEEEE9__executeEv () #5 0x0000000000404e00 в _ZNSt3__114__thread_proxyINS_5tupleIJMNS_19__async_assoc_stateIiNS_12__async_funcIPFivEJEEEEEFvvEPS7_EEEEEPvSC_ () #6 0x00007fd0a250f9ca в start_thread () из /lib/libpthread.so.0 #7 0x00007fd0a1b2e70d в clone () из /lib/libc.so.6 #8 0x0000000000000000 in?? ()
У кого-нибудь есть идея, почему?
1 ответ
Я запустил ваш пример на OS X Lion, используя:
clang++ -std=c++0x -stdlib=libc++ async.cpp
И вывод программы:
doing stuff
The answer to life, the universe and everything is 42
Изучая источник libC++, как было предложено в комментарии moshbear, я вижу:
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__
}
Мне кажется, что ~exception_ptr()
не был портирован на Ubuntu 10.04. Это низкоуровневое средство, не реализуемое в переносимом C++. Работа над созданием реализации этого уровня без GPL продолжается в libC++ abi. Я могу заверить вас, что libC++ abi не готов в прайм-тайм в настоящее время.
Также была предпринята независимая работа в этой низкоуровневой библиотеке по адресу: https://github.com/pathscale/libcxxrt. Я не знаю ни состояния этой библиотеки, ни портирования ее на ubuntu.