提问人:MyselfAndOnlyMe 提问时间:10/11/2022 最后编辑:wohlstadMyselfAndOnlyMe 更新时间:10/11/2022 访问量:88
使用其他类中的函数进行多线程处理 [已关闭]
Multithreading with function in other class [closed]
问:
我是 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
答:
2赞
wohlstad
10/11/2022
#1
线程方法需要按值划分的参数,并向其传递指向 (&engine) 的指针。ManageSounds
Engine
Engine
要修复它,您应该执行下列操作之一:
- 传递对象 iteslf(如果它是可复制的,并且在您的情况下是有意义的)。
engine
- 如果您确实需要指针/引用语义(这是非常合理的),请相应地更改线程方法。在这种情况下,您需要使用
std::ref
(因为 ctor 复制了参数)。注意:您必须确保线程不会超过对象的寿命。std::thread
engine
完整的代码示例(使用 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
评论
Engine