2009-09-29 6 views
1

J'ai N threads et ils doivent faire le travail sur les données partagées.Comment paralléliser les threads dans C pthreads

J'utilise la structure suivante:

int main(){ 
    pthread_create(..., func, ...); 
} 

void *func(void *id){ 
    lock; 
    do_job; 
    unlock; 
} 

Mon problème est que les discussions semblent fonctionner de manière séquentielle. Comment les rendre réellement parallèles?

+0

Qu'est-ce que le verrou de protection? –

+1

Rappelez-vous que si vous utilisez un processeur/noyau, vous n'obtiendrez jamais de traitement parallélisé. Cela vous semblera juste si vous le faites correctement. – eaanon01

Répondre

6

Ils sont en série car vous maintenez le verrou sur l'ensemble de votre opération. Pour obtenir effectivement le parallélisme que vous auriez besoin de faire quelque chose comme:

void func(void *id) { 
    lock; 
    do something serialised with shared data; 
    unlock; 

    do something that can be parallelised safely; 

    lock; 
    do something else with shared data; 
    unlock; 
} 

L'astuce (comme dans quoi que ce soit ou non filetée parallélisé) travaille où vous devez serialise afin de ne pas casser les choses. Ceci est pas facile.

+0

Dans votre exemple, vous ne créez que 1 thread. Si vous créez plusieurs threads, vous voudrez probablement faire un pthread_join en main sur les threads créés. Si les sorties principales avant les threads (ce qui est probable), je suis à peu près sûr que les autres threads meurent. – Vitali

+0

Je pense que le point est bien pris, cependant. –

0

La séquence dont fil est programmé pour exécuter dépendent de plusieurs choses:

  • fil priorité
  • politique de l'Annexe
  • attribution des tâches.

    Sur un seul processeur, à moins qu'un thread ne soit bloqué (par exemple en raison d'E/S en attente), la création de plusieurs threads ne rendra pas le programme rapide. Au lieu de cela, il peut ralentir le programme en raison de la surcharge du commutateur de tâche.

Et également remarquer la différence entre concurrency and parallelism.

0

Maintenez le verrou aussi petit que possible. Si vous ne le faites pas, l'ordre d'exécution des threads dégénère en une tâche séquentielle (le thread N s'exécute et verrouille la ressource, le thread N doit finir avant que d'autres threads puissent reprendre le travail, thread N terminé et thread N + 1 exécuté, assume la serrure, et ainsi de suite ..). Essayez également d'entrelacer l'accès mémoire E/S (que je suppose arbitrairement est ce que le verrou protège) avec le calcul, pour atteindre un plus grand degré de parallélisme.

Questions connexes