【问题标题】:Access a Variable of an Object from Threads从线程访问对象的变量
【发布时间】:2016-04-22 15:14:52
【问题描述】:

我的 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 相等。

感谢您的帮助:)

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • sry 但两者都没有工作:/线程只传递值而不是引用。我尝试了多种方法:/
    • 好的:)在创建线程并作为参数时使用了 std::ref。我像你的例子一样使用了 Foo& 信息
    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      相关资源
      最近更新 更多