std::thread mytobj(&A::thread_work,myobj,27); // 这里&A::thread_work 为啥要加一个&, 常规函数用函数名就可以,类成员函数名与常规函数不同吗?不是地址吗?
#include <iostream>
#include <thread>
using namespace std;
class A
{
public:
int m_i;
A(int a):m_i(a) {}
void thread_work(int num){
cout<<"thread_work() is called " << num <<endl;
}
};
int main(){
A myobj(10);
std::thread mytobj(&A::thread_work,myobj,27); // 这里
mytobj.join();
return 0;
}
c++ primer 5, 19.42 成员函数指针, 成员函数和其指针不存在自动转换规则. 规则而已, 记下就行了
在这段 C++ 代码中,& 的作用是获取成员函数指针。在第16行代码中,&A::thread_work
就是获取了 A 类的 thread_work
成员函数指针。这个指针用于在下一行代码创建一个新的线程。
在 C++ 中,如果想要调用一个类的成员函数,需要先创建该类的对象。但是,如果想要在线程中执行一个成员函数,就需要把成员函数指针传给线程。所以,在第16行中,&A::thread_work
语法表示获取 A 类中 thread_work 成员函数的地址,并将其存储在 mytobj 对象中。
mytobj 对象是 std::thread 类型的对象,它的构造函数接受函数指针和函数参数列表。在这里,构造函数的第一个参数是成员函数指针,第二个参数是传递给成员函数的参数,这里是整数 27。
通过这种方式,在第17行中,我们创建了一个新的线程,该线程会执行 myobj 对象的 thread_work 成员函数,并将整数 27 作为该函数的参数。main() 函数中的主线程会等待这个新线程执行完成后再继续运行。
总的来说,& 的作用是获取成员函数的地址,而将成员函数指针和函数参数一起传递给 std::thread 类的构造函数,可以创建一个新的线程并在该线程中执行成员函数。