使用std :: thread操作类成员

时间:2016-05-15 10:27:06

标签: c++ multithreading class

我想使用std::thread访问和修改班级成员。

以下是一个例子:

class bar {
public:
    int a = 5;
    void change_a() {
        a = 10;
        cout << "thread's a=" << a << endl;
    }
};

int main( int argc, char ** argv )
{
    bar object1;

    std::thread t1(&bar::change_a,bar());
    t1.join();

    cout << "object's a=" << object1.a << endl;
    return 0;
}

结果是:

  

线程a = 10

     

对象a = 5

因此线程中的函数修改了变量并将其打印出来,但它显然没有改变对象1,因为当我打印它时,它仍然是相同的(5)。

我的问题是,如果变量不是对象,那么变量现在在哪里?我该如何使用它呢?

2 个答案:

答案 0 :(得分:3)

std::thread t1(&bar::change_a, bar());
                               ^^^

在这里,您创建了一个临时bar对象。然后,您在此change_a对象上致电bar,因此a现在为10。现在,当语句结束时,临时bar对象将被销毁,包括变量a

object1bar无关,它只是另一个bar对象,因为您未在change_a上调用object1 {1}},来自a的{​​{1}}为object1

因此,要回答您的问题,您要创建两个5类型的对象,但您只需在一个bar上调用change_a

答案 1 :(得分:1)

由于线程遵循独立的代码执行。

要更改此项,您需要传递需要修改的对象的地址。

bar object1;
std::thread t1(&bar::change_a, &object1 );

在C ++中,使用silent this指针调用成员函数,该指针用于进一步修改Objects Contents。因此,如果你正确地传递了这个,你就可以实现这一点。

了解this pointer C++

的更多信息