使用c++ 11多线程处理非静态成员函数

Using c++ 11 multithreading on non-static member function

本文关键字:静态成员 函数 多线程处理 c++ 使用      更新时间:2023-10-16

所以,我的问题是:

  • 我有一个叫做NetworkInterface的类,它是使用RakNet网络库构建的。
  • 它持有一个方法,使用while循环,RakNet使用发送和接收数据。

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

但是,如果我只是用while循环调用方法,它会停止我的整个游戏,所以这就是为什么我想让它在不同的线程上运行,这样它就不会干扰游戏机制。现在,我使用std::thread对象在不同的线程上启动NetworkInterface中的方法,但它抛出C3867错误,该错误指出该方法需要是静态的或某种类型(我已经在Google上找到了这个),但我不知道如何修复这个问题,因为我有在该方法中使用的变量也不能是静态的。

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

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

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

int main() {
    Test x;
    std::thread t(&Test::func, &x, 42);
    t.join();
}

生活例子

注意我已经通过了&x。这是因为非静态类函数接受一个指向对象的指针,而这个指针就是this指针。其余的是42,是与方法的参数声明相对应的参数,42与示例中的int x一致。