Multithreading 使用C++0x线程库退出时崩溃

Multithreading 使用C++0x线程库退出时崩溃,multithreading,crash,c++11,packaged-task,Multithreading,Crash,C++11,Packaged Task,我刚刚开始尝试新的C++0x线程库,最后我得到了几个并行运行的计算任务。该示例运行一秒钟,这是我所期望的,但在退出时崩溃。知道我做错了什么吗 #include <future> #include <vector> #include <iostream> int main() { std::vector<std::thread> workingTasks; std::vector<std::future<int>&

我刚刚开始尝试新的C++0x线程库,最后我得到了几个并行运行的计算任务。该示例运行一秒钟,这是我所期望的,但在退出时崩溃。知道我做错了什么吗

#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回溯如下所示:

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

我发现了问题。线程是一个真正的低级原语,为了正常工作,必须连接它。在输出部件修复崩溃后添加以下代码:

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

我发现了问题。线程是一个真正的低级原语,为了正常工作,必须连接它。在输出部件修复崩溃后添加以下代码:

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

为了完全安全,您还必须保护异常路径。如果工作任务因展开而破坏,请选择加入或分离。尽管在这个小示例中,异常仍然会导致终止。为了完全安全,您还必须保护异常路径,如果workingTasks因展开而破坏,请选择加入或分离。尽管在这个小例子中,异常仍然会导致终止。