2016-05-15 76 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