在 C++ 中,使用 std::thread 函数来创建一个线程,怎么给thread传递类对象
时间: 2023-08-15 08:14:50 浏览: 132
在 C++ 中,可以通过以下两种方式给 `std::thread` 函数传递类对象:
1. 使用函数对象(Function Object):将类的成员函数包装成一个可调用的函数对象,然后将该函数对象传递给 `std::thread` 函数。
```cpp
#include <iostream>
#include <thread>
class MyClass {
public:
void myFunction(int x) {
std::cout << "Value received: " << x << std::endl;
}
};
int main() {
MyClass obj;
int value = 42;
// 创建线程,并将成员函数包装为函数对象
std::thread t(&MyClass::myFunction, &obj, value);
// 等待线程执行完毕
t.join();
return 0;
}
```
在上述示例中,`&MyClass::myFunction` 用于获取成员函数的地址,`&obj` 用于传递类对象的指针,`value` 则是要传递给成员函数的参数。
2. 使用 lambda 表达式:利用 lambda 表达式来创建一个匿名函数,并在其中调用类的成员函数。
```cpp
#include <iostream>
#include <thread>
class MyClass {
public:
void myFunction(int x) {
std::cout << "Value received: " << x << std::endl;
}
};
int main() {
MyClass obj;
int value = 42;
// 创建线程,并使用 lambda 表达式调用成员函数
std::thread t([&obj, value]() {
obj.myFunction(value);
});
// 等待线程执行完毕
t.join();
return 0;
}
```
在上述示例中,lambda 表达式 `[&obj, value]()` 捕获了类对象 `obj` 和参数 `value`,并在其中调用了成员函数。
无论是使用函数对象还是 lambda 表达式,都需要注意线程的生命周期,确保在线程执行完毕之前,相关的对象和数据仍然有效。另外,需要调用 `std::thread` 的 `join` 函数等待线程执行完毕,以避免在主线程结束时出现问题。
阅读全文