【问题标题】:Using c++ 11 multithreading on non-static member function在非静态成员函数上使用 c++ 11 多线程
【发布时间】:2014-03-26 10:15:45
【问题描述】:

所以,我的问题是这样的:

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

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

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

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

【问题讨论】:

    标签: c++ multithreading networking


    【解决方案1】:

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

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

    LIVE EXAMPLE

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

    【讨论】:

    • 我试过了,但它似乎不起作用。目前我有这个:UpdatePackages x; std::thread t1(&Up​​datePackages::func, &x); t1.join();但我显然不能这样做。这是在持有UpdatePackages类方法的类的构造函数中(抱歉我不能在cmets中改变格式)
    • @Dries 你应该传递this 而不是创建另一个对象,当然你想从this 调用一个方法,对吧?它将在另一个线程上运行,但它与简单地调用方法具有相同的原理。 std::thread t1(&UpdatePackages::func, this);
    • 是的,所以我现在更改了它,唯一的错误是&UpdatePackages::func。它说name followed by :: must be a class or namespace name。我需要包含一些东西来使用::func吗?
    • @MarkGarcia 它对我不起作用。 "没有匹配函数调用'std::thread::thread(<unresolved overloaded function type>, Test*)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2011-09-30
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    相关资源
    最近更新 更多