上記で提供されたすべてのヒントは、順次プログラム、つまりスレッドのないプログラムに対して正しいものです。スレッドを使用すると、状況が変わります。まず第一に、 std::thread へのデフォルトのパラメータは関数と関数のパラメータです。おそらくあなたは「C++ concurrency in action」という本を読んでいて、著者は興味深い例を示しています:
void do_some_work();
thread my_thread(do_some_work); //thread receives the function address
この関数を仮定します:
void do_other_job(int k); コードの本文では、次のことを行う必要があります。
k=3;
thread my_thread2(do_other_job, k);
別のスレッドを生成するため。
そのため、スレッドを使用すると、コンパイラはデフォルトで f ( in std::thread my_thread(f); ) をクラスではなく関数として解釈します。これを変更するには、 operator() を開始して、クラスで作業していることをコンパイラに警告する必要があります。代替コードは次のとおりです。
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) が実行されます。
お役に立てば幸いです。