C++std::线程和方法类

C++ std::thread and method class

本文关键字:方法 线程 C++std      更新时间:2023-10-16

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

您需要传递一个对象,在该对象上调用成员函数(记住,每个非静态成员函数都有一个隐式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 );
}

您可以使用闭包。

std::thread ThreadA( [MyClass_ptr](){ 
    MyClass_ptr->MyFunction(); 
});

是的,您需要使用绑定。以下示例用于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));