( this ) 和 ( std::ref(*this) ) 有什么区别
What's the difference between ( this ) and ( std::ref(*this) )
我以前也是这样创建线程的
std::thread(&A::Func, this);
但我发现还有另一种方式
std::thread(&A::Func, std::ref(*this));
它们有什么区别?
std::ref 是一个真正的引用,这意味着如果您在您启动的线程上访问它,它也会更改另一个线程上的对象。另一种方式也是如此。指针也可以做到这一点,但编译器可能会有不同的处理方式。只是一个忠告:你应该小心从两个线程访问一个对象并使用 std::mutex.
在启动线程 运行 class A
的成员函数的上下文中,这些调用是等效的。
第一个喜欢
void compiler_created_on_new_thread(A * a) { a->Func(); }
第二个像
void compiler_created_on_new_thread(A & a) { a.Func(); }
如果 A
是一个命名空间,它们将是可区分的
namespace A {
void Func(Thing *) { std::cout << "pointer"; }
void Func(Thing &) { std::cout << "reference"; }
}
第一个显示“指针”,第二个显示“引用”
我以前也是这样创建线程的
std::thread(&A::Func, this);
但我发现还有另一种方式
std::thread(&A::Func, std::ref(*this));
它们有什么区别?
std::ref 是一个真正的引用,这意味着如果您在您启动的线程上访问它,它也会更改另一个线程上的对象。另一种方式也是如此。指针也可以做到这一点,但编译器可能会有不同的处理方式。只是一个忠告:你应该小心从两个线程访问一个对象并使用 std::mutex.
在启动线程 运行 class A
的成员函数的上下文中,这些调用是等效的。
第一个喜欢
void compiler_created_on_new_thread(A * a) { a->Func(); }
第二个像
void compiler_created_on_new_thread(A & a) { a.Func(); }
如果 A
是一个命名空间,它们将是可区分的
namespace A {
void Func(Thing *) { std::cout << "pointer"; }
void Func(Thing &) { std::cout << "reference"; }
}
第一个显示“指针”,第二个显示“引用”