2011-07-04 5 views
1

방금 ​​새 C++ 0x 스레딩 라이브러리를 사용하기 시작했으며 마지막으로 여러 계산 작업이 병렬로 실행되었습니다. 이 예제는 1 초가 걸렸지 만 예상했던대로 종료되지만 종료하면 충돌이 발생합니다. 내가 뭘 잘못하고 있는지 알 겠어?C++ 0x 쓰레딩 라이브러리를 사용하여 종료 할 때 충돌이 발생했습니다.

Program received signal SIGABRT, Aborted. 0x0000003e45e330c5 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 64  return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig); 
(gdb) bt 
#0 0x0000003e45e330c5 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 
#1 0x0000003e45e34a76 in abort() at abort.c:92 
#2 0x0000003e496bc08d in __gnu_cxx::__verbose_terminate_handler() 
    at ../../../../libstdc++-v3/libsupc++/vterminate.cc:93 
#3 0x0000003e496ba2a6 in __cxxabiv1::__terminate (handler=<value optimized out>) 
    at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:39 
#4 0x0000003e496ba2d3 in std::terminate() at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:49 
#5 0x0000000000402d71 in std::thread::~thread (this=0x612d50, 
__in_chrg=<value optimized out>) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/thread:146 
#6 0x0000000000407052 in std::_Destroy<std::thread> (__pointer=0x612d50) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/bits/stl_construct.h:89 
#7 0x0000000000406468 in std::_Destroy_aux<false>::__destroy<std::thread*> (__first=0x612d50, 
    __last=0x612d80) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/bits/stl_construct.h:99 
#8 0x00000000004053fd in std::_Destroy<std::thread*> (__first=0x612d50, __last=0x612d80) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/bits/stl_construct.h:122 
#9 0x0000000000404963 in std::_Destroy<std::thread*, std::thread> (__first=0x612d50, 
__last=0x612d80) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/bits/stl_construct.h:148 
#10 0x0000000000403caa in std::vector<std::thread, std::allocator<std::thread> >::~vector (
    this=0x7fffffffddd0, __in_chrg=<value optimized out>) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:313 
#11 0x0000000000401f9c in main() at main.cpp:18 
+0

오류 메시지는? –

답변

4

내가 문제가 발견 다음과 같이

#include <future> 
#include <vector> 
#include <iostream> 

int main() { 
    std::vector<std::thread> workingTasks; 
    std::vector<std::future<int>> output; 
    for (int i = 0; i < 6; ++i) { 
     std::packaged_task<int()> pt(std::bind([](int data){ sleep(1); return data*data;}, i)); 
     output.push_back(pt.get_future()); 
     std::thread task(std::move(pt)); // launch task on a thread 
     workingTasks.push_back(std::move(task)); 
    } 

    for (int i = 0; i < output.size(); ++i) { 
     std::cout << i << ": " << output[i].get() << std::endl; 
    } 
} 

gdb를 백 트레이스이다. std :: thread는 정말 낮은 수준의 프리미티브이며 제대로 작동하려면 join()을 수행해야합니다. 출력 부분이 크래시를 수정 한 후 다음 코드를 추가합니다.

for (int i = 0; i < workingTasks.size(); ++i) { 
    workingTasks[i].join(); 
} 
+0

완벽하게 안전하려면 예외 경로를 보호해야합니다 (unwinding으로 인해'workingTasks'가 파괴되면 결합 또는 분리 선택). 이 작은 예에서는 예외가 있지만 어쨌든 종료됩니다. –

관련 문제