为什么std :: thread需要函数来运行rvalue?

Mic*_*iak 6 c++ multithreading c++11

有一件事std::thread我不明白:为什么构造std::thread函数的函数由rvalue运行?

我通常想要将一些成员的Functor运行到另一个线程.像这样:

struct Function
{
    void operator() ( /* some args */)
    {
        /* some code */
    }

    /* some members */
}


void run_thread()
{
    Functor f( /* some data */);
    std::thread thread(f, /* some data */);

    /* do something and wait for thread to finish */
}
Run Code Online (Sandbox Code Playgroud)

对于当前的实现,std::thread我必须确保我的对象正在实现移动语义.我不明白为什么我不能通过引用传递它.

额外的问题是:通过rvalue引用函数意味着什么?Lambda表达?

Dal*_*son 6

在run_thread方法中f是一个自动变量.这意味着范围的底部f将被销毁.你声称你将"等待线程完成",但编译器/运行时系统不知道这一点!它必须假设f将被删除,可能在应该调用其方法的线程有机会启动之前.

通过复制(或移动)f,运行时系统可以控制其副本的生命周期,f并且可以避免一些非常讨厌,难以调试的问题.