如果线程函数里面想用类的私有成员变量,可以使用std::bind函数将类的成员函数绑定到一个函数对象上,然后将该函数对象作为线程函数的参数。这样,线程函数就可以访问和修改类的私有成员变量了。
例如,下面是一个简单的例子,展示了如何在类的成员函数中使用std::thread和std::bind来访问和修改私有成员变量:
#include <iostream>
#include <thread>
class MyClass
{
public:
void setX(int x)
{
this->x = x;
}
int getX()
{
return x;
}
void threadFunc()
{
std::cout << "Thread function started" << std::endl;
std::cout << "x = " << x << std::endl;
x++;
std::cout << "x = " << x << std::endl;
std::cout << "Thread function ended" << std::endl;
}
private:
int x;
};
int main()
{
MyClass obj;
obj.setX(10);
std::thread t(&MyClass::threadFunc, &obj);
t.join();
std::cout << "x = " << obj.getX() << std::endl;
return 0;
}
这个程序定义了一个名为MyClass的类,其中包含一个私有成员变量x和一个名为threadFunc()的公有成员函数。然后,我们在主函数中创建了一个名为obj的MyClass对象,并使用obj.setX(10)设置私有成员变量。接下来,我们使用std::thread t(&MyClass::threadFunc, &obj)创建了一个新线程,并将该线程与名为threadFunc()的类成员函数绑定。最后,我们使用t.join()等待线程结束,并使用obj.getX()获取私有成员变量并将其打印到控制台上。
上面 这段代码编译 报这些错误
/usr/bin/ld: /tmp/ccJTuLu3.o: in function `std::thread::thread<void (MyClass::*)(), MyClass*, void>(void (MyClass::*&&)(), MyClass*&&)':
test.cpp:(.text._ZNSt6threadC2IM7MyClassFvvEJPS1_EvEEOT_DpOT0_[_ZNSt6threadC5IM7MyClassFvvEJPS1_EvEEOT_DpOT0_]+0x37): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
这个错误通常是由于链接器找不到pthread库而导致的。您可以在编译时使用-pthread选项来链接pthread库,例如:
g++ -std=c++11 -pthread test.cpp -o test