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;
}