在c++中有时构造线程的函数需要引用类型的参数, 此时可以用ref()函数
void t(int &a){
....
}
int main(){
int n = 0;
thread t1(t, ref(n));
t1.join();
return 0;
}
因为thread实现中用到了bind(), 此时并不能根据参数推断类型,需要用ref()说明参数是引用类型
int n;
cout << typeid(ref(n)).name() << endl; //打印ref()返回的类型
cout << typeid(forward<int &>(n) << endl; //打印引用类型
可以看出类型并不相同
thread大致实现
void add_one(int &x) {
cout << "add_one fucntion" << endl;
x += 1;
return ;
}
class thread {
public :
template<typename FUNCTION, typename ...ARGS>
Task(FUNCTION &&f, ARGS ...args) {
this->f = bind(f, forward<ARGS>(args)...);
}
private:
function<void()> f;
};
int main(){
int n = 0;
thread t(add_one, ref(n));
return 0;
}