2017-01-05 7 views
15
#include <thread> 
#include <string> 
#include <vector> 
#include <chrono> 

using namespace std; 

void f(const vector<string>& coll) 
{ 
    this_thread::sleep_for(1h); 

    // 
    // Is coll guaranteed to be valid before exiting this function? 
    // 
} 

int main() 
{ 
    { 
     vector<string> coll(1024 * 1024 * 100); 
     thread(f, coll).detach(); 
    } 

    // 
    // I know std::thread will copy arguments into itself by default, 
    // but I don't know whether these copied objects are still valid 
    // after the std::thread object has been destroyed. 
    // 

    while (true); 
} 

参照によって引数をstd :: thread関数に渡すことは安全ですか?参照によって引数をstd :: thread関数に渡すことは安全ですか?

+1

短い答え:はい、それは完全に安全で大丈夫です。 – DeiDei

+5

スレッドに参照することで何も渡していません。 –

+0

私はお詫び申し上げます、あなたは正しいです。私はコードを誤解した。 – Rafael

答えて

3
  • この関数を終了する前に有効であることが保証collですか?

    • 更新日:はい。 collmainのスレッドのコンストラクタに渡すと、collがオブジェクトなので、decayがコピーされます。このdecay本質的にはmoveのベクトルをコピーします(したがって、それはrvalueになります)。これは、スレッドの実行中にfcollパラメータにバインドされます。 (@Praetorianによるコメントありがとう)
  • 引数をstd :: thread関数に渡すのは安全ですか?

    • あなたの議論はdecayですので、実際にはstd::threadを参照して何も渡しません。 std::decayため
  • 参考:http://www.cplusplus.com/reference/type_traits/decay/

  • この質問std::thread with movable, non-copyable argumentで受け入れ答えは、@ TCさんのコメントのようstd::thread
+2

"崩壊コピー"とは何ですか?参照によって渡されない場合、コピーはどこに作成されますか? OPの例では、コピーへの参照を 'f'に渡す必要があることは明らかです。また、ラムダがこの崩壊する行動に踏み込むことなく参照によって捕捉することを可能にすることは注目に値するかもしれない。 – jtbandes

2

に渡される引数に何が起こるか説明し、あなたが渡していませんスレッドへの参照の場合は、スレッド内にベクターのコピーを作成するだけです。

thread(f, coll).detach(); // It's NOT pass by reference, but makes a copy. 

あなたが本当に参照渡ししたい場合は、あなたがこれを書く必要があります。

thread(f, std::ref(coll)).detach(); // Use std::ref to pass by reference 

スレッドが実行されるとき、それは非常に可能性のベクトルがあるだので、スレッドは、ベクトルにアクセスしようとすると、その後のコードは、セグメント・フォールトを取得します破壊された。

あなたの質問にとても:

それがのstd ::スレッド関数への参照で引数を渡すために安全ですか?

  • あなたは、オブジェクトがスレッドの実行時に有効なまま確信している場合、それは安全です。
  • オブジェクトが破壊されていると安全ではなく、セグメントエラーが発生します。
+0

新人のための明確な答え。ありがとう! – alanwsx

関連する問題