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表达?
在run_thread方法中f是一个自动变量.这意味着范围的底部f将被销毁.你声称你将"等待线程完成",但编译器/运行时系统不知道这一点!它必须假设f将被删除,可能在应该调用其方法的线程有机会启动之前.
通过复制(或移动)f,运行时系统可以控制其副本的生命周期,f并且可以避免一些非常讨厌,难以调试的问题.