线程传递的函数是类方法

普通情况下,开启一个线程只需要把函数名作为第一个参数,函数参数跟在后面传进去就行了,如下形式:

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);
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容