我正在通过在我的编译器上测试std::move
函数的变体来查看它。由于某种原因,这个程序在最新的clang ++和g ++ 4.8中都失败了。在我看来,这看起来像应该工作的正确程序。
g++-4.8 -std=c++1y -O3 -Wall -pthread main.cpp && ./a.out
在没有活动异常的情况下终止被叫
/tmp/1370796977-600590525/cmd.sh: line 7: 22819 Aborted (core dumped) ./a.out
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <thread>
#include <chrono>
void f(int n)
{
std::this_thread::sleep_for(std::chrono::seconds(n));
std::cout << "thread " << n << " ended" << '\n';
}
int main()
{
std::vector<std::thread> v;
v.emplace_back(f, 1);
v.emplace_back(f, 2);
v.emplace_back(f, 3);
std::list<std::thread> l;
for(auto& t : l) t.join();
}
我注意到导致错误的部分是emplace_back
行。当我删除它们时,程序正常编译。为什么会发生这种情况?为什么到目前为止我尝试过的所有编译器都失败了?
答案 0 :(得分:6)
您没有加入main()
中的主题。你需要
for(auto& t : v) t.join();
// ^ Look, v not l
或者,将此行放在原始循环之前,将线程从v
移动到l
:
std::move(v.begin(), v.end(), std::back_inserter(l));
for(auto& t : l) t.join();
答案 1 :(得分:1)
您似乎将列表留空,并在v。
中退出带有未连接线程的main std::thread
的IIRC析构函数如果没有加入则会终止。
答案 2 :(得分:1)
你尝试迭代空l
,但'join
没有为真正的线程完成