6
votes

Manière correcte de vérifier si des threads sont terminés?

J'utilise de multithreading dans ma demande avec _breginthread et dès maintenant pour attendre que tous les threads soient effectués, j'ai des bools globaux qui sont définis sur TRUE, car chaque thread se termine donc dans une boucle de temps jusqu'à présent. Il doit y avoir une façon plus propre de faire cela?

merci


0 commentaires

6 Réponses :


3
votes

Ce que vous voulez jeter un coup d'œil aux techniques de synchronisation des threads - Heureusement, il y a beaucoup d'informations sur MSDN qui peuvent probablement vous aider. Il est probable que vous voudrez utiliser des événements et des gauchons ici est la principale chose sur MSDN: http://msdn.microsoft.com/en-us/library/ms681924%28v=vs.85%29.aspx Il existe un certain nombre d'exemples.

Il existe également des informations sur la synchronisation dans le MFC (qui peut être utile ou non utile, ajoutée à des fins de référence): http://msdn.microsoft.com/en-us/library/975t8ks0%28vs.71%29.aspx

J'ai fait un peu de recherche, mais j'ai eu du mal à essayer de suivre certaines informations utiles pour vous, ce qui n'utilise pas la mise en œuvre MFC. Il y a un bon tutoriel ici ( http://www.informit.com/ Bibliothèque / content.aspx? B = VISAL_C_PLUSPLUS & SEQNUM = 149 ) Mais, à nouveau, en utilisant MFC. Vous pourriez jeter un coup d'œil à la mise en œuvre de MFC de mutexs comme un début.

Donc, vous devez vous familiariser avec les fonctions et les structures de synchronisation - Tout couvert sur MSDN: http://msdn.microsoft.com/en-us/library/ms686679%28v=VS.85%29.aspx


1 commentaires

Vous devez certainement utiliser des événements sur les bools.



8
votes

Vous pouvez utiliser waitformultiPleObjects attendre pour les fils finis dans le fil primaire.


2 commentaires

Si vous n'avez qu'un identifiant de thread, vous devrez d'abord la convertir en une poignée en appelant Opthread .


Non, n'appelle pas Opthread! Si le fil déjà sorti et l'ID a été réaffecté, vous pouvez vous retrouver avec une poignée à un fil aléatoire différent. Utilisez _breginthreadex, qui retourne une poignée au fil. (_BeginThread renvoie également une poignée, mais (citant les docs) qu'il "pourrait être invalide ou pointe vers un autre fil". N'utilisez jamais _breginthread.)



3
votes

Utilisez _breginthreadex à la place. _breginthread et _breginthreadex Renvoie une poignée de thread , mais le thread a commencé avec _breginthread ferme automatiquement sa poignée lors de la fin, l'utiliser pour la synchronisation n'est pas fiable.

La poignée de thread peut être utilisée avec l'une des fonctions de synchronisation de Win32, telles que waitforsingleObject ou WaitformultipleObjects .

Une fois terminé, les poignées renvoyées par _breginthreadex doivent être fermées avec CLOSEHANDLE () .


0 commentaires

0
votes

Windows fournit des événements pour un thread pour en informer un autre. Sur la case Visual C ++ fournit une prise en charge des événements uniquement à l'intérieur de la MFC. Pour une version portable, non-MFC, cochez la case Classes de gestion de la bibliothèque de boost. Ils font du lancement et de l'attente des threads beaucoup plus facilement, bien qu'ils ne donnent pas accès direct à toutes les fonctionnalités de Windows API.


0 commentaires

3
votes

La méthode habituelle consiste à conserver toutes les poignées de thread, puis à attendre sur chaque poignée. Lorsque la poignée est signalée , le thread est terminé de sorte qu'il soit retiré de l'ensemble des filets. J'utilise std :: Set pour garder une trace des poignées de thread. Il existe deux méthodes différentes pour attendre plusieurs objets sous Windows:

  1. itérer sur l'ensemble et appelez waitforsingleObject avec un délai d'attente sur chacun
  2. Convertissez l'ensemble en une matrice ou un vecteur et appelez waitformultiPleObjects

    Les premiers sons inefficaces, mais il est en fait la plus directe et la moindre erreur des deux. Si vous devez attendre tous les threads, utilisez la boucle suivante: xxx

    à l'aide de waitformultipleobjects pour attendre que les fils finissent peu plus difficile que cela semble. Ce qui suit attendra tous les threads; Cependant, il n'attend que wait_maxim_objects threads à la fois. Une autre option est de boucler sur chaque page de threads. Je laisserai cet exercice au lecteur;) xxx

    Ce n'est pas vraiment joli mais cela devrait fonctionner. Si vous faites confiance à ce que tous vos threads quitteront et ne vous dérangez pas les attendre, vous pouvez utiliser WaitformultiPleObjects (ARY.SIZE () et ARY [0], VRAI, INFINITE) . Cela n'est généralement pas très sûr car un thread en fuite fera que votre application bloque indéfiniment et il ne fonctionnera que si ary.size () est inférieur à celui de Maximum_wait_Objects .

    Bien sûr, l'autre option consiste à trouver une implémentation de pool de threads et à l'utiliser à la place. L'écriture du code de filetage n'est pas vraiment très amusante surtout une fois que vous devez le soutenir à l'état sauvage. Envisagez d'utiliser quelque chose comme boost :: thread_group à la place.


0 commentaires

1
votes

Vous pouvez utiliser Boost :: Objets de thread. Appelez rejoindre sur l'objet et il attendra que le fil finisse.


0 commentaires