2017-07-30 51 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調用的lambda不會對arrData的元素執行操作。其實,我不明白髮生了什麼事。看來,操作是在dataContainer的本地副本上執行的。

所以問題是怎麼回事,以及如何以這種方式對數組元素執行操作?

+0

tData'的'最後一次出現在'async'通話 - 將其更改爲'的std :: REF(TDATA)'。否則,它確實被價值捕獲。 –

+0

是的,它有幫助。謝謝! –

回答

2

std::async以「decay copy」爲參數。這意味着它在內部存儲了參數的副本。這是必要的,因爲通過轉發引用跨越線程邊界參數是非常危險的。

因此,如果你想要一個實際的參考傳遞給async功能,你必須使用std::ref

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