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

または、元のループの前に次の行を配置して、スレッドを から に移動しvます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.

結合されていない場合、呼び出しの IIRC デストラクタstd::threadは終了します。

于 2013-06-09T17:07:00.157 に答える
1

emptylを反復しようとしますが'join、実際のスレッドでは達成されません

于 2013-06-09T17:07:10.250 に答える