2011-12-07 37 views
6

Tôi vừa biên soạn và cài đặt clang + llvm 3.0 trên ubuntu 10.04 của tôi, và cũng libC++ từ svn. Khi trạng thái trong libC++ hiển thị hỗ trợ luồng hoàn tất, tôi muốn thử std :: async. Vì vậy, tôi làm theo tấm gương do Anthony Williams trongstd :: async trong clang 3.0 + libC++ không hoạt động?

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

Và chỉ thực hiện thay đổi nhỏ để làm cho nó biên dịch:

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

Và tôi biên dịch với

kêu vang ++ --std = C++ 0x -stdlib = libC++ -lpthread async.cpp

Tuy nhiên, nó chạy và luôn luôn kết thúc bằng kết xuất lõi:

làm công cụ Câu trả lời cho cuộc sống, vũ trụ và mọi thứ bị hủy bỏ (core dumped)

tôi kiểm tra các bãi chứa lõi và nó cho thấy chồng như thế này (mà tôi không hoàn toàn nhận được một gợi ý)

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

Bất kỳ ai cũng có ý tưởng tại sao?

+2

Việc hủy bỏ có nghĩa là xác nhận đã không thành công. Nhìn vào assert() s trong exception.cpp gần dòng 130. Sử dụng gdb để phá vỡ hủy bỏ và phân tích người dân địa phương được khuyến khích mạnh mẽ. – moshbear

Trả lời

7

Tôi chạy ví dụ của bạn trên OS X Lion, sử dụng:

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

Và đầu ra chương trình:

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

Kiểm tra nguồn gốc của libC++ theo đề nghị của bình luận moshbear của tôi thấy:

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

Dường như với tôi rằng ~exception_ptr() chưa được chuyển đến ubuntu 10.04. Đây là một cơ sở cấp thấp không thể thực hiện được trong C++ di động. Công việc tạo ra việc triển khai miễn phí GPL ở cấp độ này đang diễn ra tại libc++abi. Tôi có thể đảm bảo với bạn rằng libC++ abi chưa sẵn sàng cho thời gian chính tại thời điểm này.

Cũng có một nỗ lực độc lập tại thư viện cấp thấp này tại: https://github.com/pathscale/libcxxrt. Tôi không biết tình trạng của thư viện này và nó không được chuyển đến ubuntu.

Các vấn đề liên quan