C ++並列プログラミングの本物の - ノート

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,避 免悬垂指针


 

 

おすすめ

転載: blog.csdn.net/smartgps2008/article/details/91346124