为什么这个cppreference演示程序会导致分段错误?

时间:2013-06-09 17:01:14

标签: c++ c++11

我正在通过在我的编译器上测试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行。当我删除它们时,程序正常编译。为什么会发生这种情况?为什么到目前为止我尝试过的所有编译器都失败了?

3 个答案:

答案 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没有为真正的线程完成