[英]Start a thread with a member function should pass a object or pointer or a reference?
我对使用成员函数启动线程感到困惑。 我知道我需要传递一个类对象作为第二个参数。 但是有人将对象传递给thread()
,有人传递了一个地址,而我试图传递一个引用。 它们都编译正常。 所以我很困惑哪个是正确的。
class X
{
public:
void do_lengthy_work(){
std::cout << "1:1" << std::endl;
}
};
int main(){
X my_x;
std::thread t(&X::do_lengthy_work, std::ref(my_x)); // pass reference
std::thread t(&X::do_lengthy_work, &my_x); // pass address
std::thread t(&X::do_lengthy_work, my_x); // pass object
t.join();
return 0;
}
线程构造函数根据std::invoke
的规则开始执行线程。 所以你展示的所有 3 行代码都会做一些事情。
如果您希望对象的生命周期长于线程的生命周期,则前两行(引用和指针)很好。 正如您从上面指向std::invoke
的链接中看到的那样,它们是等价的。 否则,第三行将对象复制到线程中。 这意味着原始对象现在无关紧要并且可以被销毁,但也意味着任何结果都不会在原始对象中可见,只有副本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.