普通情况下,开启一个线程只需要把函数名作为第一个参数,函数参数跟在后面传进去就行了,如下形式:
void func(int a, string s) {
...
}
int main() {
int aa = 1;
string ss = "hello";
thread t1(func, aa, ss);
}
但当 func 是类中的一个方法时,情况就有些变化,我们需要把函数用函数指针的形式传进去,同时还应该把类对象的地址跟在函数后面,如:
class C {
public:
C() {};
void func(int a, string s) { ... }
}
int main() {
int aa = 1;
string ss = "hello";
C c;
thread t1(&C::func, &c, aa, ss);
}
但是更好的写法是将类对象包成一个 shared_ptr 以防止栈帧溢出,然后用 shared_ptr 的 get() 方法获得裸指针传入新的线程:
int main() {
int aa = 1;
string ss = "hello";
auto c = make_shared<C>();
thread t1(&C::func, c.get(), aa, ss);
}