2017-07-30 3 views
1

L'idée était d'effectuer des opérations sur chaque élément de la matrice en parallèle. Je viens avec ce qui suit:Modification du tableau avec 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; 
} 

Cependant, lambda appelé par std :: async ne réalise pas les opérations sur les éléments de arrData. En fait, je ne comprends pas ce qui se passe. Il semble que les opérations sont effectuées sur la copie locale de dataContainer. Donc la question est ce qui se passe, et comment puis-je effectuer des opérations sur des éléments de tableau de cette manière?

+0

La dernière occurrence de 'tData', dans' appel async' - changer à ' std :: ref (tData) '. Sinon, il est en effet capturé par la valeur. –

+0

Oui, ça m'a aidé. Merci! –

Répondre

2

std::async prend les paramètres par "copie de décroissance". Cela signifie qu'il stocke en interne une copie des paramètres. C'est nécessaire parce que le fait de rassembler les paramètres à travers les limites des fils via des renvois est très dangereux.

En tant que tel, si vous voulez passer une référence à une fonction réelle async, vous devez utiliser std::ref:

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