2013-01-09 1 views
0

Je le scénario suivant:besoin de conseils/suggestion sur la synchronisation des pthreads (combiner l'utilisation de la variable de l'état et de la barrière)

je partage une tâche en plusieurs étapes, il y a plusieurs fils dans chaque étape pour faire le travail et les threads de l'étape suivante doivent attendre que tous les threads de l'étape en cours se terminent.

Par exemple:

Fil 1, 2, 3 font le travail dans la première étape

Fil 4, 5, 6 font le travail à l'étape deux

Fil 7, 8, 9 effectuent l'étape trois ...

Les threads de chaque étape sont indépendants, mais ils doivent attendre que les threads de l'étape précédente se terminent.

Voici comment je veux y parvenir:

  1. Dans chaque fil de l'étape en cours, attendez à la condition que représentant que si l'étape actuelle peut être démarré
  2. une fois l'étape en cours peut être démarré , tous les threads commencent à faire le travail, et attendent une barrière pour que tous les threads de cette étape se terminent
  3. Une fois que tous les threads de cette étape sont terminés, diffusez sur la variable d'état sur laquelle les threads d'étape suivants attendent

Est-ce que ça fait? Quelque chose ne va pas ici?

Je suis gâté par les structures de langage de haut niveau pour les programmes multithread, et l'utilisation des API pthread est douloureuse pour moi. Ici, j'ai besoin de conseils sur la meilleure pratique dans ce cas d'utilisation? Merci beaucoup

+0

Il semble que votre stratégie semble assez bonne. Dans votre scénario, l'approche de parallélisation est (1) tâche "pipeline" et (2) chaque étape "fork-join", qui utilise la variable de condition pour (1) et la barrière pour (2). – yohjp

+0

Merci pour votre commentaire, @yohjp. J'ai déjà implémenté une solution de travail en appliquant l'approche ci-dessus :) – chuchao333

Répondre

0

Pour les personnes qui s'intéressent à cette question. J'ai déjà implémenté une solution de travail. Je pense que cela devrait être un problème parallèle/concurrent typique yohjp a commenté:

1 "Pipelined" tasks 
2 "Join" on each of the stage 

J'ai utilisé un tableau de [num_stage] barrières pthread et un tableau de paires [de num_stage + 1] (de pthread_cond_t, pthread_mutex_t). puisque dans le thread principal, il utilisera une variable conditionnelle de plus pour démarrer.

Si quelqu'un veut l'exemple de code, s'il vous plaît m'a contacté par e-mail, car cela fait partie d'un travail d'attribution, je ne pouvais pas publier le code à github.

Ceci est mon premier programme multi-thread non-essai en utilisant l'API pthread première expérience très agréable :)

Questions connexes