使用其他类中的函数进行多线程处理 [已关闭]

Multithreading with function in other class [closed]

提问人:MyselfAndOnlyMe 提问时间:10/11/2022 最后编辑:wohlstadMyselfAndOnlyMe 更新时间:10/11/2022 访问量:88

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

去年关闭。

我是 c++ 的新手,很抱歉,如果答案很明显。我正在尝试获取一个线程来运行另一个带有参数的类的函数。

我的代码是这样布局的:

int main(){ 
    Engine engine; 
    Sounds sounds; 
    std::thread t(&Sounds::ManageSounds, &sounds, &engine) 
    /*some stuff*/
    t.join();
} 
    
class Sounds{ 
    void ManageSounds(Engine en){ 
        /*some stuff*/ 
    } 
}

如果我按原样运行此代码,则会出现以下错误:

错误:静态断言失败:std::thread 参数必须 转换为 RVALUES 129 后可调用 |
typename decay<_Args>::type...>::值

如果我更改为不接受任何参数并删除线程中的参数,它完全可以正常工作。ManageSounds()&engine

C++ 多线程 指针

评论

1赞 Drew Dormann 10/11/2022
解决此问题的方法取决于您对 的定义。(可以复制吗?可以移动吗?Engine
0赞 user4581301 10/11/2022
它应该被复制还是移动?您的需求是什么?
0赞 Ulrich Eckhardt 10/11/2022
这甚至不是远程有效的 C++ 代码。首先,请提取一个最小的可重现示例。如果您使用线程示例作为起点,然后尝试添加单个功能,而不是一次添加多个功能,也会有所帮助。

答:

2赞 wohlstad 10/11/2022 #1

线程方法需要按划分的参数,并向其传递指向 (&engine) 的指针ManageSoundsEngineEngine

要修复它,您应该执行下列操作之一:

  1. 传递对象 iteslf(如果它是可复制的,并且在您的情况下是有意义的)。engine
  2. 如果您确实需要指针/引用语义(这是非常合理的),请相应地更改线程方法。在这种情况下,您需要使用 std::ref(因为 ctor 复制了参数)。注意:您必须确保线程不会超过对象的寿命。std::threadengine

完整的代码示例(使用 copy):

#include <thread>

class Engine { /*...*/ };

class Sounds {
public:
    void ManageSounds(Engine en) {
        /*some stuff*/
    }
};

int main() {
    Engine engine;
    Sounds sounds;
    //--------------------------------------------vvvvvv
    std::thread t(&Sounds::ManageSounds, &sounds, engine);
    /*some stuff*/
    t.join();
}

完整的代码示例(使用引用):

#include <thread>

class Engine { /*...*/ };

class Sounds {
public:
    //-----------------------v
    void ManageSounds(Engine & en) {
        /*some stuff*/
    }
};

int main() {
    Engine engine;
    Sounds sounds;
    //--------------------------------------------vvvvvvvvvvvvvvvv
    std::thread t(&Sounds::ManageSounds, &sounds, std::ref(engine));
    /*some stuff*/
    t.join();
}

评论

0赞 Ben Voigt 10/11/2022
可能想要的是std::ref