2016-05-15 32 views
0

我在阅读“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函数完成时该对象超出了范围,但我无法理解如何避免作者提到它。

+2

那么,不要使用参考。使函数参数为'int i_',而不是按照值复制。查看C++ 11 lambda表达式以使代码更现代。 –

回答

4

该问题不是func对象。 std::thread将复制你的函子。

首先构造拷贝/移动所有参数(这两个函数 对象f和所有ARGS ...),以线程访问的存储

的问题是参考int& i;你的仿函数保持对some_local_state一旦some_local_state超出范围,这确实将是无效的。

要解决此问题,请复制some_local_state的值,而不是保留对其的引用。如果您需要共享访问权限,请考虑使用std::shared_ptr