C++11/14 引入了 std::thread 类和一些线程库支持,可以方便地支持在 C++11/14 中创建线程。
当需要在线程内调用类的对象或传递参数时,有几种方法可以实现。
调用类对象
使用成员函数
C++11/14 允许我们使用 lambda 表达式在一个新线程中调用一个类的某个成员函数。我们需要捕获类对象的引用,例如:
class MyClass {
public:
void myFunction(int a, int b) {
/* ... */
}
};
int main() {
MyClass myObj;
std::thread myThread([&myObj](){
myObj.myFunction(1, 2);
});
myThread.join();
return 0;
}
在此示例中,我们创建了一个名为 myObj
的 MyClass
实例,并在使用 lambda 表达式创建线程时捕获了它的引用。在 lambda 表达式的主体中,我们调用 myObj
的 myFunction
成员函数,向它传递参数 1 和 2。
使用函数包装器
我们还可以使用函数包装器来调用类的成员函数。将一个指向类的成员函数的指针传递给一个函数包装器,它会为我们创建一个可调用对象。例如:
#include <functional>
class MyClass {
public:
void myFunction(int a, int b) {
/* ... */
}
};
void callMyFunction(MyClass* obj, int a, int b) {
obj->myFunction(a, b);
}
int main() {
MyClass myObj;
std::thread myThread(
std::bind(&callMyFunction, &myObj, 1, 2)
);
myThread.join();
return 0;
}
在此示例中,我们定义了一个函数 callMyFunction
,它接收一个指向 MyClass
的指针以及 myFunction
成员函数需要的两个参数。通过使用 std::bind 函数包装 callMyFunction
,我们将 &myObj
指针传递给该函数以捕获类对象,并在运行新线程时执行。
线程传参
使用 lambda 表达式
对于传递一个变量的情况,我们可以使用 lambda 表达式来捕获该变量并将其传递给线程。例如:
int main() {
int myVar = 42;
std::thread myThread([myVar](){
std::cout << "myVar: " << myVar << std::endl;
});
myThread.join();
return 0;
}
在此示例中,我们创建了一个变量 myVar
,并将其传递给新线程中使用 lambda 表达式创建的线程。在 lambda 主体中,我们输出 myVar
的值。
使用 std::ref 函数
如果要传递一个引用类型的变量,则需要使用 std::ref 函数:
#include <functional>
void myFunction(int& myVar) {
myVar = 10;
}
int main() {
int myVar = 42;
std::thread myThread(myFunction, std::ref(myVar));
myThread.join();
std::cout << "myVar: " << myVar << std::endl;
return 0;
}
在此示例中,我们创建了一个名为 myVar
的变量,并在使用 std::thread 构造函数初始化线程时使用了 std::ref(myVar)
。在 myFunction
中,我们将 myVar
的值更改为 10。在主函数中,我们输出 myVar
的新值,即 10。
总结:以上是在 C++11/14 中实现线程调用类对象和线程传参的两种方法和两个示例。在使用这些方法时,需要注意避免悬空引用或内存泄漏,以确保线程的正确性和安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11/14 线程调用类对象和线程传参的方法 - Python技术站