Comment synchroniser un processus avec un nombre aléatoire de threads actifs?

voix
0

J'ai le problème suivant. Mon processus engendre 4 fils, qui effectuent la même tâche de manière indépendante et ont besoin d'attendre tous pour terminer le traitement avant d'aller à la prochaine itération de traitement. Cependant, le nombre de threads actifs, à savoir, le nombre de threads de traitement des données et qui ont besoin d'attendre que les autres à terminer est variable de 1 à 4. Par exemple, quelques fois 2 threads et traiter les données dont ils ont besoin d'attendre les uns des autres avant de continuer.

J'ai ai lu que les obstacles pourraient le faire pour moi, mais, quand ils sont créés, je dois spécifier le nombre de threads à attendre, ce qui est le cas avec ma demande. En outre, en raison de la façon dont l'application a été mis en œuvre, il serait difficile et complexe de continuer à créer / détruire chaque fois que des obstacles.

Je me demandais s'il y a une autre façon de résoudre ce problème.

Merci!

Créé 18/12/2018 à 11:02
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Voici comment vous pouvez y parvenir en utilisant Sémaphore.

// Global Sempahore initialized to zero.
Sempahore global_sempahore(0)

// Your main thread which spawns your 'n' worker thraeds.
// After spawning 'n' threads your main thread will wait for those threads to finish.
for (int i=0; i<n; i++) {
    global_sempahore.sem_wait();
}


// This is your worker thread routine.
// After processing the common work routine before exiting each thread will signal the sempahore.
global_sempahore.sem_post();

L'idée est initialiser le sémaphore en mode verrouillé avec 0. Après la ponte votre n threads de travail dans la principale attente de fil sur pour sémaphore n fois.

Dans thread de travail juste avant la sortie du signal du sémaphore.

Cela permettra d' assurer que le fil principal se réveillera que lorsque tous les n fils a terminé son exécution.

Créé 20/12/2018 à 06:12
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more