web-dev-qa-db-fra.com

Passer plusieurs arguments dans std :: thread

Je demande la bibliothèque <thread> au standard C++ 11. 

Disons que vous avez une fonction comme: 

void func1(int a, int b, ObjA c, ObjB d){
    //blahblah implementation
}

int main(int argc, char* argv[]){
    std::thread(func1, /*what do do here??*/);
}

Comment passez-vous tous ces arguments dans le fil? J'ai essayé d'énumérer les arguments tels que: 

std::thread(func1, a,b,c,d);

Mais il se plaint de l'absence d'un tel constructeur. Un moyen de contourner ce problème consiste à définir une structure pour empaqueter les arguments, mais existe-t-il un autre moyen de le faire? 

37
turtlesoup

Vous les transmettez littéralement à std::thread(func1,a,b,c,d); qui aurait dû être compilé si les objets existaient, mais c'est faux pour une autre raison. Comme il n'y a pas d'objet créé, vous ne pouvez pas joindre ou détacher le thread et le programme ne fonctionnera pas correctement. Comme il s'agit d'un temporaire, le destructeur est immédiatement appelé, puisque le thread n'est pas encore joint ou détaché, std::terminate est appelé. Vous pouvez le remplacer par std::join ou std::detach avant la destruction du temp, comme par exemple std::thread(func1,a,b,c,d).join();//or detach

Voici comment cela devrait être fait. 

std::thread t(func1,a,b,c,d);
t.join();  

Vous pouvez également détacher le fil, lire sur les fils si vous ne connaissez pas la différence entre rejoindre et détacher.

47
aaronman

Si vous obtenez cela, vous avez peut-être oublié de mettre #include <thread> au début de votre fichier. La signature de OP semble vouloir fonctionner. 

0
pixelpax