C++ 使用类的成员函数启动线程的几种方法

C++11 及之后的标准中,std::thread 支持通过类的成员函数启动线程。启动线程执行类的成员函数有三种常见方法:一是直接传递成员函数指针和对象指针给 std::thread,这是最基本的方式;二是使用 std::bind 将成员函数与对象及参数绑定,提升灵活性;三是使用 lambda 表达式封装成员函数调用,代码更简洁、现代且可读性强,是最推荐的方式。

1、使用 std::thread 并传入成员函数指针和对象指针

使用 std::thread 启动类的成员函数时,可以通过传入 成员函数指针 和 对象指针 来实现。这是最直接的方式之一。

#include<iostream>
using namespace std;
#include <thread>

class MyClass {
public:
    void memberFunction(int value) {
        std::cout << "成员函数中传入的值是: " << value << std::endl;
    }
};

int main() {
    MyClass obj;
    std::thread t(&MyClass::memberFunction, &obj, 42); // 注意 &obj
    t.join();
    return 0;
}

2、使用 std::bind 绑定成员函数和对象

C++ 中,使用 std::bind 可以将类的成员函数与对象绑定在一起,从而方便地传入 std::thread。这是一种灵活且可读性较好的方法。std::bind 会预先将对象和参数绑定好,使其行为像普通函数。

#include <iostream>
#include <thread>
#include <functional>
using namespace std;

class MyClass {
public:
    void memberFunction(int value) {
        std::cout << "使用 std::bind: " << value << std::endl;
    }
};

int main() {
    MyClass obj;
    auto boundFunc = std::bind(&MyClass::memberFunction, &obj, 100);
    std::thread t(boundFunc);
    t.join();
    return 0;
}

3、使用 lambda 表达式封装调用

C++ 中,使用 lambda 表达式 来封装成员函数的调用是一种现代、简洁且非常推荐的方式,尤其适用于启动线程时传入类的成员函数。

#include <iostream>
#include <thread>
using namespace std;

class MyClass {
public:
    void memberFunction(int value) {
        std::cout << "使用 lambda 启动线程:" << value << std::endl;
    }
};

int main() {
    MyClass obj;
    std::thread t([&obj]() {
        obj.memberFunction(77);
    });
    t.join();
    return 0;
}

推荐阅读
cjavapy编程之路首页