使用 C++0x 线程库退出时崩溃
我刚刚开始尝试新的 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
I just started trying the new C++0x threading library, and I finally got several computation tasks run in parallel. The example takes one second to run, which is what I expected, but it crashes on exit. Any idea of what I'm doing wrong?
#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;
}
}
The gdb backtrace is as follows:
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我发现了问题。 std::thread 是一个非常低级的原语,必须进行 join() 才能正常工作。在输出部分修复崩溃后添加以下代码:
I found the problem. std::thread is a really low-level primitive, and has to be join()'ed in order to work properly. Adding the following code after the output part fixed the crash: