上面提供的所有提示对于顺序程序都是正确的,我的意思是,没有线程的程序。使用线程事情会改变。首先,默认情况下 std::thread 的参数是函数和函数参数。可能你正在研究“C++ concurrency in action”一书,作者展示了一个有趣的例子:
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 ( 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)。
我希望我有所帮助。