我想使用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)。
我的问题是,如果变量不是对象,那么变量现在在哪里?我该如何使用它呢?
答案 0 :(得分:3)
std::thread t1(&bar::change_a, bar());
^^^
在这里,您创建了一个临时bar
对象。然后,您在此change_a
对象上致电bar
,因此a
现在为10
。现在,当语句结束时,临时bar
对象将被销毁,包括变量a
。
object1
与bar
无关,它只是另一个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。因此,如果你正确地传递了这个,你就可以实现这一点。
的更多信息