如何使线程函数自包含
问题描述:
我在阅读“C++并发在行动”。 我对下面的代码片断有以下怀疑。如何使线程函数自包含
struct func
{
int& i;
func(int& i_):i(i_){}
void operator()()
{
for(unsigned j=0;j<1000000;++j)
{
do_something(i); //Can have issue of dangling references
}
}
};
void oops()
{
int some_local_state=0;
func my_func(some_local_state);
std::thread my_thread(my_func);
my_thread.detach();
}
笔者说,为了避免这种情况的一个方法是 使线程功能自足和复制数据到线程,而不是共享数据
我明白了问题是因为创建的函数对象是oop函数的本地对象,当oops函数完成时该对象超出了范围,但我无法理解如何避免作者提到它。
答
该问题不是func
对象。 std::thread
将复制你的函子。
首先构造拷贝/移动所有参数(这两个函数 对象f和所有ARGS ...),以线程访问的存储
的问题是参考int& i;
你的仿函数保持对some_local_state
一旦some_local_state
超出范围,这确实将是无效的。
要解决此问题,请复制some_local_state
的值,而不是保留对其的引用。如果您需要共享访问权限,请考虑使用std::shared_ptr
。
那么,不要使用参考。使函数参数为'int i_',而不是按照值复制。查看C++ 11 lambda表达式以使代码更现代。 –