C ++ std :: thread和方法类

时间:2014-09-02 22:15:16

标签: c++ multithreading c++11

我正在尝试使用带有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;
}

3 个答案:

答案 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));