从线程访问对象的变量
Access a Variable of an Object from Threads
我的 C++ 程序需要帮助。
我在主函数旁边开始线程:
thread Thread1(&Foo::Loop1, info,std::ref(info));
thread Thread2(&Foo::Loop2, info,std::ref(info));
info
是来自 class Foo
的对象,其中包含 bool active
稍后我将 active
更改为 true
但 Loop1
或 Loop2
中的值没有改变。他们每次都一样。
我的原型函数如下所示:
void Loop1(Foo info);
void Loop2(Foo info);
调用函数:
void Foo::Loop1(Foo info){
while (true){
if (info.active){
//Stuff
}
}
}
那么我应该怎么做才能传递对象 Foo
的值,它在 main
函数中发生变化,因此 Loop
函数中的值 active
相等.
感谢您的帮助:)
std::ref
returns 一个 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
。
如果函数是静态成员,它们应该有一个引用参数,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);
我的 C++ 程序需要帮助。 我在主函数旁边开始线程:
thread Thread1(&Foo::Loop1, info,std::ref(info));
thread Thread2(&Foo::Loop2, info,std::ref(info));
info
是来自 class Foo
的对象,其中包含 bool active
稍后我将 active
更改为 true
但 Loop1
或 Loop2
中的值没有改变。他们每次都一样。
我的原型函数如下所示:
void Loop1(Foo info);
void Loop2(Foo info);
调用函数:
void Foo::Loop1(Foo info){
while (true){
if (info.active){
//Stuff
}
}
}
那么我应该怎么做才能传递对象 Foo
的值,它在 main
函数中发生变化,因此 Loop
函数中的值 active
相等.
感谢您的帮助:)
std::ref
returns 一个 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
。
如果函数是静态成员,它们应该有一个引用参数,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);