0

我需要帮助,我的C++程序。 我开始主函数旁主题:从线程访问一个对象的变量

thread Thread1(&Foo::Loop1, info,std::ref(info)); 
thread Thread2(&Foo::Loop2, info,std::ref(info)); 

info是从含有bool active

Foo一个对象后,我改变Loop1Loop2activetrue但该值不变化。他们每次都是一样的。

我的函数原型是这样的:

void Loop1(Foo info); 
void Loop2(Foo info); 

调用的函数:

void Foo::Loop1(Foo info){ 
    while (true){ 
     if (info.active){ 
      //Stuff 
     } 
    } 
} 

所以,我应该怎么做才能通过从对象Foo其价值的变化在main功能使值active中的Loop功能是相等的。

谢谢你的帮助:)

回答

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); 
+0

SRY但两者didnt工作:/线程只能传递价值,而不是参考。我尝试了很多东西:/ – NicMaxFen

+0

确定它:)使用std :: ref时创建线程和作为参数。我用你的例子使用Foo&info – NicMaxFen

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作为参考。