私は短いコードを提示させ、問題を示すために、 - 上記のコードでは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にスコープを拡張するというこの問題をどのように解決すればよいでしょうか。あなたのコードではなく、あるべきよう
スマートポインタを使用してオブジェクトのライフタイムを制御する – Slava
@Slava申し訳ありませんが、私はそれを前もって言及していませんでしたが、オブジェクトをそのように宣言しているわけではありません。だから私はここでどのようにスマートポインタを使用するか分からない。私は編集しました。 –
この場合、値で渡します。ラムダは、終了するまで生き続けるコピーを取得します。参照は使用しません。 – Slava