我的c ++程序需要帮助。 我在主函数旁边开始Threads:
thread Thread1(&Foo::Loop1, info,std::ref(info));
thread Thread2(&Foo::Loop2, info,std::ref(info));
info
是来自班级Foo
的对象,其中包含bool active
稍后我将active
更改为true
,但Loop1
或Loop2
中的值不会更改。它们每次都是一样的。
我的原型函数如下所示:
void Loop1(Foo info);
void Loop2(Foo info);
被叫函数:
void Foo::Loop1(Foo info){
while (true){
if (info.active){
//Stuff
}
}
}
那么我该怎样做才能传递Foo
函数中更改的main
中的值,以使active
函数中的值Loop
相等。< / p>
感谢您的帮助:)
答案 0 :(得分:0)
std::ref
会返回std::reference_wrapper<T>
,可通过其转换运算符隐式转换为T&
。当您将std::reference_wrapper<T>
传递给按值接受T
的函数时,将调用转换运算符,并通过其复制构造函数构造函数的T
本地副本。
#include <functional>
class Object
{
// ...
};
void Func(Object obj)
{
// Some code which modifies obj
}
int main()
{
Object obj;
Func(std::ref(obj)); // <-- Conversion operator invoked, obj passed by value
}
通过引用更改函数以接受Foo
。
答案 1 :(得分:0)
如果函数是静态成员,则它们应具有引用参数Foo&
。
void Loop1(Foo& info);
void Loop2(Foo& info);
否则线程会获得您传递的对象的副本。
如果他们是非静态成员,则根本不需要传递实例:
void Foo::Loop1(){
while (true){
if (active){
//Stuff
}
}
}
thread Thread1(&Foo::Loop1, info);
thread Thread2(&Foo::Loop2, info);