2013-03-16 9 views
13

C++ 11ベクトル::スレッド私は<code>vector</code><code>std::thread</code>のSを作成しようとしています

。次の3つの点の組み合わせが可能であると言います。 http://en.cppreference.com/w/cpp/thread/thread/threadによれば

1)、 threadのデフォルトコンストラクタは、作成http://en.cppreference.com/w/cpp/thread/thread/operator%3Dによれば

thread object which does not represent a thread.

2)、threadの によればoperator=

Assigns the state of [the parameter, which is a thread rvalue reference] to [the calling thread] using move semantics.

3) http://en.cppreference.com/w/cpp/container/vector/vector、 ベクトル型コンストラクタにサイズ型変数のみを渡す

コンソール出力:

Hello 
これは以下で見られるように、VC11で期待どおりに動作し、 g++ 4.8.0 (online compiler here)

#include <iostream> 
#include <thread> 
#include <vector> 

void foo() 
{ 
    std::cout << "Hello\n"; 
    return; 
} 

int main() 
{ 
    std::vector<std::thread> vecThread(1); 
    vecThread.at(0) = std::thread(foo); 
    vecThread.at(0).join(); 
    return 0; 
} 

:CT

the container with [the specified number of] value-initialized (default constructed, for classes) instances of T. No copies are made.

だから、私はこれをしませんでした

は、それから私は与え同じウェブページ、上のコンパイラメニューを切り替えることによって、打ち鳴らす3.2でそれを試してみました:

stderr: 
pure virtual method called 
terminate called without an active exception 

すると、スレッドオブジェクトを表しスレッド行くスコープ外join()編またはdetach()される前にプログラムが強制終了されます。私はjoin()vecThread.at(0)を持っているので、問題に残された唯一の事は

vecThread.at(0) = std::thread(foo);

割り当てに一時的なスレッド

std::thread(foo);

です。

しかし、Webリファレンスによれば、スレッドはスレッドの値の参照を移動することによってのみ割り当てることができます。私はjoin()またはdetach()へのいかなる方法も一時的なスレッドオブジェクトと考えることはできません。

したがって、clangの出力が正しい場合、threadoperator=の使用は何ですか?あるいはこれはclangコンパイラのバグですか?

g ++ 4.8。0は、(括弧付き括弧を置換)

vecThread.at(0) = std::thread{foo}

vecThread.at(0) = std::thread(foo)

ラインを変更することは依然として期待Hello出力を与えます。

しかし、vecThread.at(0) = {foo}に行を変更すると、それは文句を作る:ブレースの

G ++ 4.8.0の苦情は:すぎる

error: converting to 'std::thread' from initializer list would use explicit constructor 'std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(); _Args = {}]' vecThread.at(0) = {foo};

先進-私はそれが何を意味するのか分かりません。中括弧の

打ち鳴らす3.2の苦情:打ち鳴らすで同じ変更を行う

さらに高度与え

error: no viable overloaded '=' 
vecThread.at(0) = {foo}; 
... 
note: candidate function not viable: cannot convert initializer list 
argument to 'const std::thread' 
thread& operator=(const thread&) = delete; 
... 
note: candidate function not viable: cannot convert initializer list 
argument to 'std::thread' 
thread& operator=(thread&& __t) noexcept 

をし、私はそれがどちらかの意味がわかりません。

VC11は、2012年11月CTPコンパイラのように、標準ライブラリ上に均一な初期化構文をサポートしていないので、私は

vecThread.at(0) = {foo}

上記の問題を裏付けるためにVC11を使用することはできません。

+0

'-pthread'でコンパイルしましたか?ビットは冗長ですが、コードは正常に見えます。 –

+0

オンラインコンパイラの 'compiler/interpreter'引数のテキストフィールドに' -pthread'を追加すべきですか? Webページのテキストフィールドの元のコンパイラ/インタプリタの引数に追加して、clangに '-std = C++ 11 -Wall -W -pedantic -O2 -pthread'を作成しましたが、' terminate'を呼び出すと同じ結果が得られました。 – CodeBricks

+0

'-std = C++ 0x -pthread'でコンパイルすると、[this code](http://ideone.com/4B2Elt)が動作します... –

答えて

7

最初の例は正しいです。例外を投げることは、libstdC++でclangを使用しているときに知られているbugです。これを解決するには、libC++(llvm版のC++ライブラリ)をインストールする必要があります。 libcの++

$ clang++ -std=c++11 -stdlib=libc++ main.cpp -o main -lc++ -lsupc++ -lpthread

#include <thread> 

int main() 
{ 
    std::thread t([]() {}); 
    t.join(); 
    return 0; 
} 

以下P.S.でコンパイルの例を参照してください hereを参照してください。理由は、フラグ -lsupc++も必要です。

関連する問題