我正在尝试使用带有std :: thread
的类的函数以下代码段返回错误
MyClass *MyClass_ptr = new MyClass;
MyClass_ptr->MyFunction(); // Works
std::thread ThreadA(MyClass_ptr->MyFunction() ); // Error here
std::thread ThreadB(MyClass_ptr->MyOtherFunction() ); // Error here
我需要使用该类的特定指针创建一个线程:MyClass_ptr
那么,有没有办法使用这个特定的指针来使用该类的方法?
如果它在这里有用的是用Microsoft Visual Studio 2013编译的完整代码
#include "stdafx.h"
#include <iostream>
#include <thread>
class MyClass
{
public:
void MyFunction();
void MyOtherFunction();
};
void MyClass::MyOtherFunction()
{
std::cout << "Inside MyOtherFunction" << std::endl;
std::cin.get();
}
void MyClass::MyFunction ()
{
std::cout << "Inside MyFunction" << std::endl;
std::cin.get();
}
int _tmain(int argc, _TCHAR* argv[])
{
MyClass *MyClass_ptr = new MyClass;
MyClass_ptr->MyFunction(); // Works
std::thread ThreadA(MyClass_ptr->MyFunction() ); // Error here
std::thread ThreadB(MyClass_ptr->MyOtherFunction() ); // Error here
delete MyClass_ptr;
MyClass_ptr = nullptr;
return 0;
}
答案 0 :(得分:2)
您需要传递一个将调用成员函数的对象(请记住,每个非静态成员函数都有一个隐式this
参数):
#include <thread>
class MyClass
{
public:
void MyFunction();
void MyOtherFunction();
};
int main()
{
MyClass *MyClass_ptr = new MyClass;
std::thread ThreadA(&MyClass::MyFunction, MyClass_ptr);
std::thread ThreadB(&MyClass::MyOtherFunction, MyClass_ptr );
}
答案 1 :(得分:1)
你可以使用一个闭包。
std::thread ThreadA( [MyClass_ptr](){
MyClass_ptr->MyFunction();
});
答案 2 :(得分:0)
是的,你需要使用bind。以下示例适用于boost绑定,但您可以始终使用绑定的C ++ 11版本。您可以像这样使用它
boost::thread t(boost::bind(&sommeclass::someMethod, ptr_instance_of_someclass,parameters_if_any));
所以在你的情况下它将是
boost::thread ThreadA(boost::bind(MyClass::MyFunction,MyClass_ptr));