Question

Je crée n fils et de départ puis ensuite l'exécution suite à une panne de la barrière.

Dans l'espace de données globales:

int bkdown = 0;

Dans main ():

pthread_barrier_init(&bar,NULL,n);

for(i=0;i<n;i++)
{
pthread_create(&threadIdArray[i],NULL,runner,NULL);
if(i==n-2)printf("breakdown imminent!\n");
if(i==n-1)printf("breakdown already occurred!\n");
}

En fonction de coureur de fil:

void *runner(void *param)
{
 pthread_barrier_wait(&bar);

 if(bkdown==0){bkdown=1;printf("barrier broken down!\n");}

        ...

 pthread_exit(NULL);
}

ordre attendu:

breakdown imminent!
barrier broken down!
breakdown already occurred!

ordre réel: (testé à plusieurs reprises)

breakdown imminent!
breakdown already occurred!
barrier broken down!!

Quelqu'un pourrait-il expliquer pourquoi je ne reçois pas le message "broken down" avant que le message de "already occurred"?

Était-ce utile?

La solution

for(i=0;i<n;i++)
{
pthread_create(&threadIdArray[i],NULL,runner,NULL);
if(i==n-2)printf("breakdown imminent!\n");
if(i==n-1)printf("breakdown already occurred!\n");
}

Rien n'arrête cette boucle d'exécuter jusqu'à i == n-1. pthread_create () juste Déclenché un fil à exécuter. Il ne l'attend pas à démarrer ou à la fin. Ainsi, vous êtes à la merci du planificateur, ce qui pourrait décider de poursuivre l'exécution de votre boucle, ou passer à l'un des fils nouvellement créés (ou les deux, sur un système SMP).

Vous êtes également initalizing la barrière à n, donc dans tout aucun cas des threads franchir la barrière jusqu'à ce que vous avez créé tous.

Autres conseils

L'ordre dans lequel les sujets sont exécutés dépend du système d'exploitation. Tout simplement parce que vous commencez un fil ne signifie pas que le système d'exploitation va exécuter immédiatement.

Si vous voulez vraiment contrôler l'ordre dans lequel les fils sont exécutés, vous devez mettre une sorte de synchronisation là-dedans (avec mutex ou variables de condition.)

En plus des réponses de nos et Starkey que vous devez prendre en compte que vous avez une autre sérialisation dans votre code qui est souvent négligé. Vous faites IO sur la même variable FILE, à savoir stdin

L'accès à cette variable est mutexed interne et l'ordre dans lequel vos fils de n+1 (y compris votre thread appelant) avoir accès à cette mutex est mise en œuvre définie, prendre essentiellement comme au hasard dans votre cas.

l'ordre dans lequel vous obtenez votre sortie printf est l'ordre dans lequel vos fils passent à travers ces trous de ver.

Vous pouvez obtenir l'ordre prévu dans l'une des deux façons

  • Créer chaque thread avec une priorité plus élevée que le thread principal. Cela permettra d'assurer que le nouveau fil se déroulera immédiatement après la création et attendre sur la barrière.
  • Déplacer la "rupture imminente! \ N" print avant la pthread_create () et l'utilisation d'appel un appel sched_yield () après chaque pthread_create (). Ce programmera le fil nouvellement créé pour l'exécution.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top