从线程访问对象的变量

Access a Variable of an Object from Threads

本文关键字:变量 对象 访问 线程      更新时间:2023-10-16

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

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函数中发生变化,以便Loop函数中active的值相等。

感谢您对:)的帮助

如果函数是静态成员,它们应该有一个引用参数,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);

std::ref返回一个可通过其转换运算符隐式转换为T&std::reference_wrapper<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