2017-03-31 3 views
3

私は短いコードを提示させ、問題を示すために、 - 上記のコードではSTDのためのREFオブジェクトがパスの範囲を拡張::スレッド

void someMethod() { 

    // CustomType obj; 
    const auto obj = getCustomTypeObj(); 

    std::thread([](customType &obj) { 
    // some delay 
    obj.doSomething(); 
    obj.close(); 
    // can now be destructed 
    }).detach(); 

    // similarly for std::async 
    std::async(std::launch::async, [](customType &obj){ 
    obj.doSomething(); 
    obj.close(); 
    } 

    // there might not be any use of obj here 

    // should not be destructed here because std::thread might not get it. 

} 

CustomTypeタイプオブジェクトがそのために構成されているコンストラクタをコピー削除されます。だから私はどこでも参考にしてそれを渡すか、または関連スコープでゼロから作成する必要があります。しかし、私が現在扱っている1つのシナリオでは、std::threadの実行方法の中にある関連スコープでそれを作成することはかなり可能ではありません。

objが破壊されて、std::threadの仕事が完了し、その後何が起こるかわからないことがあります。では、std :: threadのlambdaにスコープを拡張するというこの問題をどのように解決すればよいでしょうか。あなたのコードではなく、あるべきよう

+1

スマートポインタを使用してオブジェクトのライフタイムを制御する – Slava

+0

@Slava申し訳ありませんが、私はそれを前もって言及していませんでしたが、オブジェクトをそのように宣言しているわけではありません。だから私はここでどのようにスマートポインタを使用するか分からない。私は編集しました。 –

+0

この場合、値で渡します。ラムダは、終了するまで生き続けるコピーを取得します。参照は使用しません。 – Slava

答えて

4

はところで、あなたのコードは、あなたがオブジェクトを渡さない、間違っている:オブジェクトの有効期間の問題を回避した値によって、ラムダや関数へのあなたのオブジェクトを渡すと移動するには

auto obj = getCustomTypeObj(); 

    std::thread([](customType &obj) { 
    // some delay 
    obj.doSomething(); 
    obj.close(); 
    // can now be destructed 
    }, std::ref(obj)).detach(); 

あなたそこにオブジェクト:

auto obj = getCustomTypeObj(); 

    std::thread([](customType arg) { // note by value, not reference 
    // some delay 
    arg.doSomething(); 
    arg.close(); 
    // arg will be destroyed here 
    }, std::move(obj)).detach(); // object moved 

今ラムダまたは関数は、そのオブジェクトを所有し、それが機能の終了時に破棄されます。ここにはlive exampleがあります。std::unique_ptrの代わりにcustomTypeの代わりにコピーが無効になっていて、動くことを検証するタイプがあります。

+0

私はshared_ptrも考えていませんでした。あなたが別のオプションとしてshare_ptrを持つことについての行を追加することができればそれは素晴らしいでしょう:D –

+0

この場合、あなたは 'std :: shared_ptr'を必要としません。そのオブジェクトを返すことができますし、スレッド関数に移すことができます。あなたの関数が 'std :: shared_ptr'または' std :: unique_ptr'を返すならば、解決策は明らかです。 – Slava

関連する問題