1-- 一時オブジェクトをスレッドパラメータとして渡します
detach() を使用してスレッドを分離する場合、パラメータを渡すときに次の問題に注意する必要があります。
(1) int などの単純な型パラメータを渡す場合、パラメータの再利用の問題を避けるために、参照転送ではなく値転送を使用することを お勧めします(メインスレッドが最初に終了し、参照によって渡されたパラメータが再利用され、無効なパラメータが発生します)サブスレッドの場合);
(2) 複合型パラメータ(クラスなど)を渡す場合、暗黙的な型変換は避けるべきです(暗黙的な型変換が発生すると、メインスレッドが終了し、渡されるパラメータがまだ暗黙的な変換を受けていない可能性があります)型変換、現時点では、一時オブジェクト ( std::string(s)や
class(value) は、最初にメインスレッドで一時オブジェクトを生成し、次にパラメータを渡すためにパラメータを渡し、同時に参照 ( myprint 関数の const myclass &cls など) を使用して関数パラメータを受け取ります。
必要がない場合は、スレッドを分離するために detach() を使用しないようにしてください。
#include <iostream>
#include <thread>
#include <string>
class myclass{
public:
int value;
myclass(int v):value(v){std::cout << "value: " << value << std::endl;};
};
void myprint(const int i, const std::string &str, const myclass &cls){
std::cout << "i: " << i << std::endl;
std::cout << "str: " << str << std::endl;
}
int main(){
int idx = 10;
std::string s = "ABC";
int value = 5;
std::thread thread1(myprint, idx, std::string(s), myclass(value));
thread1.detach();
return 0;
}