2017-07-30 7 views
1

考え方は、配列の各要素に対して並行して操作を実行することでした。私は以下を思い付きます:std :: asyncを使って配列を編集する

struct dataContainer 
{ 
    int value; 
    bool flag; 
    dataContainer() 
     : value(1) 
     , flag(true) 
    {} 
}; 


int main() 
{ 
    std::vector<dataContainer> arrData; 
    arrData.resize(10); 

    { 
     std::vector<std::future<void> > results; 
     std::for_each(arrData.begin(), arrData.end(), [&results](dataContainer& tData) { 

      results.emplace_back(std::async(std::launch::async, [](dataContainer& ttData) { 
       ttData.value++; 
       ttData.flag = false; 
      }, tData)); 
     }); 
    } 

    return 0; 
} 

しかし、std :: asyncによって呼び出されたラムダは、arrDataの要素に対して操作を実行しません。実際、私は何が起こっているのか分かりません。操作はdataContainerのローカルコピーで実行されているようです。

何が起きているのですか?このように配列要素の操作を実行するにはどうすればよいですか?

+0

async'コール 'で' tData'の最後の出現 - 'に変更しますstd :: ref(tData) 'を実行します。それ以外の場合は、実際には価値によって捕捉されます。 –

+0

ええ、それは助けました。ありがとう! –

答えて

2

std::asyncは、 "減衰コピー"でパラメータをとります。これは、内部的にパラメータのコピーを格納することを意味します。これは、転送参照を使用してスレッド境界を越えてパラメータをマーシャリングすることは非常に危険です。

あなたはasync機能への実際の参照を渡したい場合はこのように、あなたがstd::refを使用する必要があります。

results.emplace_back(std::async(std::launch::async, [](dataContainer& ttData) { 
    ttData.value++; 
    ttData.flag = false; 
}, std::ref(tData))); 
関連する問題