上記に寄せられたすべてのヒントは、逐次プログラムには正しいです。つまり、スレッドのないプログラムです。スレッドを使用すると変更されます。 まず第一に、std :: threadのパラメータは、関数と関数のパラメータです。おそらくあなたは著書「アクションでC++同時実行」を研究していた、と著者は興味深い例を示します。
void do_some_work();
thread my_thread(do_some_work); //thread receives the function address
は、この関数とします
ボイドdo_other_job(int型k)を、 コードの本体では、あなたが実行する必要があります。
k=3;
thread my_thread2(do_other_job, k);
別のスレッドを生成するために。
スレッドを使用すると、コンパイラはデフォルトでクラスではなく関数f(std :: thread my_thread(f);)を解釈します。これを変更するには、演算子()を起動してコンパイラに警告する必要があります。 代替コードは次のようになります。
class background_task{
public:
background_task(){
do_sth();
do_sth_else();
}
void operator()(){}
};
background_task f;
thread mythread10(f);
は最終的には、オペレータを供給し、スレッドを使用して、正しいではありませんので、このコードは動作しません:
void operator()(int x){
do_sth();
cout<<"x = "<<x<<endl;
}
内のすべてのコードので、それが起こりますブラケットは読み取り専用であり、実行時には変更できません。コンストラクタに変数を挿入する場合は、スレッドの初期化時に変数を挿入する必要があります。したがって:
class backg{
public:
backg(int i){
do_sth(i);
}
void operator()(){}
};
int main(){
thread mythread{ backg(12) }; //using c++11
return 0;
}
間違いなく実行され、生成されたスレッドで関数do_sth(12)が実行されます。
私は助けてくれることを願っています。
クールで、より明確になりました。 –
この明示的なコールタスク()を除いて、operator()()の暗黙的な呼び出しはありますか? –
@ forester2012、あなたはもっとはるかに扱いにくい 'task.operator()()'構文も使うことができますが、常に明示的に呼び出さなければなりません。この演算子を内部的に呼び出す多くの標準アルゴリズムがあります。 –