0

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

4

3 回答 3

6

您没有加入main(). 你需要

 for(auto& t : v) t.join();
 //            ^ Look, v not l

或者,将此行放在原始循环之前以将线程从vinto移动l

std::move(v.begin(), v.end(), std::back_inserter(l)); 
for(auto& t : l) t.join();
于 2013-06-09T17:04:57.543 回答
1

您似乎将列表留空,并以 v 中未连接的线程退出 main。

如果未加入,调用的 IIRC 析构函数std::thread将终止。

于 2013-06-09T17:07:00.157 回答
1

您尝试遍历 empty l,但'join对于真正的线程没有完成

于 2013-06-09T17:07:10.250 回答