C++ 错误:在将std::thread与接收指针的函数一起使用时,必须调用对非静态成员函数的引用
我只是想在我的程序中执行一些多线程,我的一个函数叫做C++ 错误:在将std::thread与接收指针的函数一起使用时,必须调用对非静态成员函数的引用,c++,multithreading,sdl-2,C++,Multithreading,Sdl 2,我只是想在我的程序中执行一些多线程,我的一个函数叫做Setup,它的名字是这样的:Setup(renderer)并声明为无效设置(SDL_渲染器*渲染器)但是当我尝试让线程运行函数时,我得到一个错误:错误:必须在以下行调用对非静态成员函数的引用:std::thread th1(设置,渲染器)。如何让另一个线程运行该程序的功能?似乎安装程序是一个成员函数。如果是这样,调用它的一种简单方法是将lambda传递给std::thread: std::thread th1([this, renderer]
Setup
,它的名字是这样的:Setup(renderer)代码>并声明为无效设置(SDL_渲染器*渲染器)代码>但是当我尝试让线程运行函数时,我得到一个错误:错误:必须在以下行调用对非静态成员函数的引用:std::thread th1(设置,渲染器)代码>。如何让另一个线程运行该程序的功能?似乎安装程序是一个成员函数。如果是这样,调用它的一种简单方法是将lambda传递给std::thread
:
std::thread th1([this, renderer](){ this->Setup(renderer); });
当调用成员函数时,编译器需要知道在哪个对象上调用函数。如果只执行std::thread(Setup,renderer)
,编译器无法知道要在哪个对象实例上调用Setup函数
您需要以某种方式将该实例传递给线程——如我所示,使用lambda是一种方法此
仅当您试图使用Setup函数在对象的成员函数中构造线程时有效。如果没有,下面是一个稍微不同的示例:
// You have some class with a Setup function...
class A { public: void Setup(SDL_Renderer* renderer); };
// You have an instance of that class:
A a_instance;
// You have the argument to the function
SDL_Renderer* renderer = /**/;
// You want to create a thread that runs A::setup on a_instance
std::thread th1([a = &a_instance, renderer]()
{
a->Setup(renderer);
});
好的,有几件事。这是什么
在示例中,它是类的名称吗?函数Setup
的类和声明不是静态的,我不确定这些信息是否有用。另一件事是它给了我另一个奇怪的错误:对符号“pthread\u create@@GLIBC\u 2.2.5”的未定义引用
当您在非静态成员函数(类中的函数)中时,此
始终引用调用函数的对象。线程是在对象的某个实例上调用的某个函数的内部创建的-此
就是该实例。我们将这个
传递到lambda中,这样线程就可以调用相应对象上的设置
函数。对于未定义的引用-您可能需要链接到pthread。如果我也在属于同一类的函数中执行多线程处理,这会正常工作吗?好的,它已编译,但现在我的代码显示一个黑色矩形,而不是一些文本?听起来像是您必须解决的另一个问题。如果多线程在属于同一类的函数中,那么Yes将或可以工作。