2.1.1
関数オブジェクトは、スレッドのコンストラクタに渡されたときに、もう一つ注意すべきは、「最も厄介なパース」(C ++の最も厄介な回避する必要があるパース、 中国はじめに)。あなたは場合という名前の変数の代わりに一時的な変数を渡し、C ++コンパイラではなく、オブジェクトの型を定義するよりも、関数宣言を解析します。
たとえば、次のように
のstd ::スレッドmy_thread(background_task()); //
ここでの関数と呼ばmy_threadとかなりのステートメントであるパラメータ(関数はパラメータはありませんし、関数background_taskオブジェクトへのポインタを返す)、関数がスレッドを起動するのではなく、STD ::スレッドオブジェクトを返すと、この関数は。前の名前の関数オブジェクト、またはブラケット①の複数のセットの使用を使用するか、この問題を回避するために、②新しい統一された初期化構文を使用します。ラムダ式を使用することで、この問題を回避することができます。
次のように:
STD ::スレッドmy_thread((background_taskを())); // 1。
STD ::スレッドmy_thread {background_task()}。// 2
2.2
パラメータは、フォームへの参照であり、新しいスレッドにアクセスすることができる場合であっても、メモリ内の別のスレッドにコピーされるデフォルトパラメータ
void f(int i, std::string const& s);
std::thread t(f, 3, "hello");
char buffer[1024]; // 1
sprintf(buffer, "%i",some_param);
std::thread t(f,3,buffer); // 2
t.detach();
std::thread t(f,3,std::string(buffer));//使用std::string,避 免悬垂指针