在非静态成员函数上使用c ++ 11多线程

Dri*_*ies 8 c++ networking multithreading

所以,我的问题是:

  • 我有一个名为NetworkInterface的类,它使用RakNet网络库构建.
  • 它拥有一个使用RakNet用来发送和接收数据的while循环的方法.

现在,我将NetworkInterface类设为单例,因为我希望它在我写的游戏中只存在一次.

但是,如果我只是用while循环调用方法,它将停止我的整个gqme所以这就是为什么我希望它在不同的线程上运行,所以它不会干扰游戏机制.现在,我使用std :: thread对象在另一个线程上的NetworkInterface中启动方法,但它抛出C3867错误,该错误表明该方法需要是静态的或某种类型(我已经在Google上发现了这个)但是我不知道我知道如何解决这个问题,因为我在该方法中使用的变量也不能是静态的.

我希望这很清楚.简而言之,我如何在程序的单独线程中从类中实现非静态方法.或者,还有更好的方法?(如果弹出,我不想使用Boost库)

Mar*_*cia 18

您需要提供一个对象来调用非静态成员函数,就像您不能自己调用​​一样method().要提供该对象,请std::thread在放置函数的参数后将其传递给构造函数.

struct Test {
    void func(int x) {}
};


int main() {
    Test x;
    std::thread t(&Test::func, &x, 42);
    t.join();
}
Run Code Online (Sandbox Code Playgroud)

现场例子

请注意,我已经过去了&x.这是因为非静态类函数接受指向它的对象的指针,并且该指针是this指针.其余的,是42与方法的参数声明对应的参数,42int x示例中的一致.