以上贡献的所有提示对顺序程序都是正确的,我的意思是,程序没有线程。使用线程的东西改变。 首先,默认情况下,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)。
我希望我能帮上忙。
很酷,现在更清晰。 – 2012-08-08 03:34:18
除了这个显式调用任务()以外,是否存在operator()()的隐式调用? – 2012-08-08 06:22:18
@ forester2012,不,你必须总是明确地调用它,尽管你也可以使用更为尴尬的'task.operator()()'语法。有许多标准算法会在内部调用这个算子。 – 2012-08-08 13:10:20