2010-08-30 5 views
1

J'ai un morceau de code qui utilise des threads Boost pour accélérer le calcul, mais j'ai besoin de le déboguer et je veux les lancer en série, pas en parallèle. Comment je fais ça?Comment faire pour que les fils Boost fonctionnent en série, pas en parallèle?

+3

Err .. ne lancez pas le sous-programme prévu via l'enfilage. –

+0

Pour le problème plus général: [Comment détecter et déboguer les problèmes de multi-threading?] (Http://stackoverflow.com/questions/499634/how-to-detect-and-debug-multi-threading-problems) –

+3

Votre le pilote du clavier a un problème de race de threading. –

Répondre

1

Sauf s'il me manque quelque chose, il suffit de le déboguer en utilisant un seul thread. Oubliez le multithreading à moins d'avoir un algorithme correct.

1

En supposant que vous vouliez dire «pour accélérer le calcul», les threads en cours d'exécution en série n'aideront pas du tout les performances. En fait, cela vous coûterait de la performance pour les frais généraux sur les threads, car vous ne parallélisez aucun travail.

Si vous êtes si enclin à les exécuter en série, assurez-vous que chacun d'eux attend la fin de l'exécution du thread en cours avant d'en autoriser l'exécution. Il me manque probablement quelque chose ici.

+3

Il souhaite que les threads en série facilitent le débogage. D'où le "mais j'ai besoin de le déboguer et je veux les exécuter en série" partie de sa première phrase. Il est sûr de supposer qu'il voudra réactiver les threads parallèles plus tard après avoir réparé les bogues. –

+0

Exactement ce que je voulais dire. Merci, Emile. – gt6989b

1

Vous pouvez créer un sémaphore pour chaque thread, puis signaler le 1er sémaphore dans le thread principal, et chaque thread peut signaler le sémaphore suivant à sa fin. Mais, encore, pourquoi besoin pour déboguer votre application de cette façon? Il est très utile de déboguer l'application avec tous les threads en cours d'exécution afin que vous puissiez voir si des conditions de course se produisent, ou quelque chose comme ça.

+0

Je me demandais si vous pouviez utiliser un simple appel système pour l'exécuter dans un thread, comme MSalters proposé ci-dessous. – gt6989b

+0

Eh bien, dans ce cas, il suffit de définir des points de rupture partout. Ça va te donner ce genre d'expérience. – Gianni

1

Placez des points d'arrêt dans tous vos sujets. Votre débogueur doit avoir une commande pour parcourir ou démarrer un seul thread. Le reste de vos threads restera suspendu, de sorte qu'ils n'interféreront pas avec votre débogage monothread. Une fois le thread terminé, vous pouvez reprendre tous les threads, ou continuer le débogage dans le thread suivant.

+0

Je me demandais si vous pouviez utiliser un simple appel système pour l'exécuter dans un thread, comme MSalters proposé ci-dessous. – gt6989b

0

Affectez uniquement un cœur de processeur unique à votre processus. Sous Windows, vous pouvez le faire avec SetProcessAffinityMask

+2

Cela ne garantit pas que ses threads seront sérialisés. – tibur

+0

Exactement ce dont j'avais besoin. Je voulais obtenir l'appel de boost correct pour forcer la bibliothèque à exécuter 1 thread à la fois, s'il y en avait un, sur Red Hat Linux. – gt6989b

+1

@ Gt6989b, bien que cela ne fera en effet qu'un seul thread à la fois, tous les threads seront encore actifs, ce qui signifie que le planificateur OS peut choisir d'interrompre un thread à tout moment et en laisser un autre fonctionner à la place. Plutôt que de tourner en série ou en parallèle, votre thread s'exécutera * entrelacé *. C'est difficile pour moi de dire si c'est vraiment ce que tu veux. –