繁体   English   中英

用成员函数启动线程应该传递对象或指针还是引用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM