2009-02-17 6 views
3

J'ai besoin de paralléliser un simple cracker de mot de passe, pour l'utiliser sur un système à n processeurs. Mon idée est de créer n threads et de les nourrir de plus en plus de travail à mesure qu'ils finissent.pthreads - comment paralléliser un travail

Quelle est la meilleure façon de savoir quand un thread a terminé? Un mutex? Ne coûte pas cher de vérifier ce mutex en permanence alors que d'autres threads sont en cours d'exécution?

+1

Ce système n-processeur pourrait-il être le botnet Confiker, peut-être? –

+0

Uhm, non ... pour l'instant, n = 2 ;-) Peut-être à l'avenir! – zakk

+2

Pourquoi ai-je le soupçon lancinant que cela pourrait être utilisé pour le mal? –

Répondre

5

Vous pouvez avoir une structure de file d'attente simple - utilisez n'importe quelle structure de données - et utilisez simplement un mutex lorsque vous ajoutez/en supprimez des éléments.

Pourvu que vos threads capturent le travail dont ils ont besoin en "morceaux" assez gros, il y aura très peu de conflits sur le mutex, donc très peu de frais généraux. Par exemple, si chaque thread devait saisir environ 1 seconde de travail à la fois et travailler indépendamment pendant 1 seconde, il y aurait alors très peu d'opérations sur le mutex.

Les threads pouvaient sortir quand ils n'avaient plus de travail; le thread principal pourrait alors attendre en utilisant pthread_join.

+0

ok, j'ai presque compris ... une dernière chose: quel thread le thread principal doit-il rejoindre? Même si tous les sous-threads ont à peu près la même quantité de travail, vous ne pouvez jamais dire lequel finira en premier ... – zakk

+0

Rejoignez-les tous, dans n'importe quel ordre; rejoindre un fil qui a déjà fini reviendra immédiatement. – MarkR

1

Utiliser un message en file d'attente entre les fils: -

Master -> Processus (dire Emportez). Processus -> Maître (dire que j'ai fini - donnez-moi plus, ou, j'ai trouvé le résultat!)

En utilisant cela, le thread se ferme seulement lorsque le système le fait - autrement, il est soit le traitement des données ou en attente dans une file d'attente de messages. De cette façon, le MCP (j'ai toujours voulu dire ça!) Traite simplement les messages et les travaux manuels sur des threads qui attendent plus de travail.

Cela peut être plus efficace que de créer et détruire des threads tout le temps.

1

Normalement, vous utilisez une "variable de condition" pour ce genre de choses où vous voulez attendre la fin d'un travail asynchrone.

Les variables d'état sont essentiellement des signaux simples protégés par mutex. Pthread a des variables de condition (voir par exemple la fonction pthread_cond_create (...)).

Questions connexes