clang 3.0 + libc ++中的std :: async不起作用?

时间:2011-12-07 00:01:57

标签: c++ multithreading c++11 clang libc++

我刚刚在我的ubuntu 10.04上编译并安装了clang + llvm 3.0,以及来自svn的libc ++。由于libc ++中的状态显示线程支持已完成,我想尝试std :: async。所以我按照Anthony Williams在

中给出的例子

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

只需做一些小改动就可以编译:

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

有人知道为什么吗?

1 个答案:

答案 0 :(得分:7)

我在OS X Lion上运行了您的示例,使用:

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

程序输出:

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

按照moshbear的评论建议检查libc ++的来源我看到了:

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 ++中无法实现的低级设施。正在libc++abi开展有关创建此级别的无GPL实施的工作。我可以向你保证,libc ++ abi目前尚未准备好迎接黄金时段。

这个低级别的图书馆也有一个独立的工作:https://github.com/pathscale/libcxxrt。我不知道这个库的状态,也不知道它是否被移植到ubuntu。