从线程访问对象的变量

时间:2016-04-22 15:14:52

标签: c++ multithreading variables visual-studio-2013 pass-by-reference

我的c ++程序需要帮助。 我在主函数旁边开始Threads:

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

info是来自班级Foo的对象,其中包含bool active

稍后我将active更改为true,但Loop1Loop2中的值不会更改。它们每次都是一样的。

我的原型函数如下所示:

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

被叫函数:

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

那么我该怎样做才能传递Foo函数中更改的main中的值,以使active函数中的值Loop相等。< / p>

感谢您的帮助:)

2 个答案:

答案 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);
相关问题