41 votes

En C++11, quel est l'intérêt d'un thread qui "ne représente pas un fil d'exécution" ?

En regardant les nouvelles fonctionnalités de threading dans C++11 pour voir comment elles s'adaptent facilement à pthreads, j'ai remarqué une section curieuse dans la section thread zone de construction :

thread() ;
Effets : Construit un objet thread qui ne représente pas un fil d'exécution.
Postcondition : get_id() == id()
Les lancers : Rien.

En d'autres termes, le constructeur par défaut d'un thread ne semble pas réellement créer un fil. Évidemment, cela crée un fil objet, mais comment cela peut-il être utile s'il n'y a pas de code de soutien pour cela ? Existe-t-il un autre moyen d'attacher un "fil d'exécution" à cet objet, comme par exemple thrd.start() ou quelque chose de similaire ?

37voto

Luc Danton Points 21421

Existe-t-il un autre moyen d'attacher un "fil d'exécution" à cet objet, comme thrd.start() ou quelque chose de similaire ?

// deferred start
std::thread thread;

// ...

// let's start now
thread = std::thread(functor, arg0, arg1);

std::thread est un type MoveConstructible et MoveAssignable. Cela signifie donc que dans un code comme std::thread zombie(some_functor); std::thread steal(std::move(zombie)); zombie sera laissé dans un état spécial, mais valide, associé à aucun fil d'exécution. Le constructeur par défaut est gratuit dans un sens puisque tout ce qu'il a à faire est de mettre l'objet dans cet état exact. Il permet également aux tableaux de std::thread et des opérations comme std::vector<std::thread>::resize .

18voto

Nicol Bolas Points 133791

Ça veut dire la même chose que ça :

 std::vector<int> emptyList;

emptyList est vide. Tout comme une construction par défaut std::thread . Tout comme une construction par défaut std::ofstream n'ouvre pas de fichier. Il y a des raisons parfaitement raisonnables pour que les classes qui se construisent par défaut soient dans un état vide.


Si vous avez un fil vide :

std::thread myThread;

Vous pouvez en fait commencer le fil de discussion en faisant cela :

myThread = std::thread(f, ...);

f est quelque chose d'appelable (pointeur de fonction, foncteur, std::function etc.), et ... sont les arguments à transmettre au fil de discussion.

8voto

Howard Hinnant Points 59526

Pas seulement des suppositions :

Le terme "objet filaire" désigne un std::thread .

Le "fil d'exécution" désigne le La collection de registres matériels du système d'exploitation qui représente un fil d'exécution. .

C++11 ne fait rien d'autre que de recouvrir l'API de l'OS pour l'accès aux threads de l'OS afin de rendre le threading C++ portable sur tous les OS.

thread() ;
Effets : Construit un objet thread qui ne représente pas un fil d'exécution.
Postcondition : get_id() == id()
Les lancers : Rien.

Cela signifie que l'on construit par défaut std::thread ne fait pas référence à un fil d'exécution que le système d'exploitation a produit.

A std::thread peut recevoir une nouvelle valeur, et ainsi commencer à se référer à un fil d'exécution du système d'exploitation par une instruction d'affectation de déplacement :

std::thread t;  // Does not refer to an OS thread
//...
t = std::thread(my_func);  // t refers to the OS thread executing my_func

3voto

davmac Points 4317

Je ne fais que supposer, mais cela signifie simplement que le fil n'est pas lancé. En d'autres termes, il s'agit d'un objet comme un autre - il n'y a pas nécessairement un véritable thread OS derrière lui. En d'autres termes, si les threads étaient implémentés au-dessus de pthreads, la création d'un objet thread C++11 n'appelle pas nécessairement pthread_create() - cela ne doit se produire que lorsque le thread est lancé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X