2016-05-15 4 views
0

"C++ Concurrency in Action"を読んでいます。 私は以下のコードスニペットで疑問を持っています。スレッド機能を自己完結させる方法

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のラムダ式を見て、コードをモダンにする。 –

答えて

4

問題はfuncオブジェクトではありません。 std::threadあなたのファンクタをコピーします。

まずコンストラクタコピー/すべての引数(両方の機能 オブジェクトfとすべての引数...)スレッドアクセスするためのストレージを

が動く問題がint& i;あなたのファンクタはsome_local_stateに保ち参照ですsome_local_stateが有効範囲外になると実際に無効になります。

これを解決するには、参照を保持する代わりにsome_local_stateの値をコピーします。共有アクセスが必要な場合は、std::shared_ptrを使用することを検討してください。

関連する問題