为什么std::thread采用函数由右值运行
Why does std::thread take function to run by rvalue?
关于std::thread
有一件事我不明白:为什么std::thread
的构造函数使用函数由右值运行?
我通常想运行一个具有一些成员的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 */
}
对于std::thread
的当前实现,我必须确保我的对象正在实现移动语义。我不明白为什么我不能通过参考。
额外的问题是:用右值来指函数意味着什么?Lambda表达式?
在您的run_thread方法中,f
是一个自动变量。这意味着在作用域的底部f
将被销毁。你声称你将"等待线程完成",但编译器/运行时系统并不知道!它必须假设f
将被删除,可能在应该调用其方法的线程有机会启动之前。
通过复制(或移动)f
,运行时系统可以控制其f
副本的寿命,并可以避免一些非常棘手、难以调试的问题。
std::reference_wrapper
将向包装的对象公开一个operator()
。如果您愿意进行手动终身维护,std::thread t(std::ref(f));
将参考运行f
。
当然,在您的代码中,这会导致未定义的行为,因为您没有正确管理生命周期。
最后,请注意,原始thread
是一个糟糕的"客户端代码"工具。async
稍微好一点,但实际上您想要一个包含packaged_task
s和future
s以及条件变量的任务队列。C++11添加了足够的线程支持来编写一个像样的线程系统,但它提供了原语,而不是好的"客户端代码"工具。
在玩具程序中,这可能就足够了。
相关文章:
- 如何在函数运行时逐个显示列表项
- C++:链接库两次,全局构造函数运行两次吗?
- C 从类的构造函数运行Boost线程
- 回文过滤器,函数运行良好,但main()无法编译
- 如何在 c++ 中将机器代码作为函数运行
- 将 PHP 中的 $_POST 变量传递给由 exec() 函数运行的C++程序
- 如何在 C++ 中使用一个 System() 函数运行 2 个命令
- 为什么用空函数运行std::线程会花费大量内存
- 在函数运行时停止 Wt C++函数
- C 构造函数运行时/编译时间
- 是否可以在析构函数运行时不销毁 obj
- CArray的析构函数运行大约需要30秒
- 如何使这个递归函数运行得更快
- 如何在Visual studio C++中检查函数运行时间
- C++函数运行,即使它不应该运行?
- 参数的可变数量函数运行时错误
- boost::asio::io_service析构函数运行很长时间
- 具有变量参数的函数运行时错误
- C++析构函数运行时错误:无法munmap
- 如何在 MEX 函数运行时制作它 printf?