2010-04-02 4 views
3

Existe-t-il des pthread_barrier dans le noyau Linux SMP?barrières dans le noyau Linux SMP

Lorsque le noyau fonctionne simultanément sur 2 CPU et plus avec la même structure, la barrière (comme pthread_barrier) peut être utile. Il arrêtera toutes les CPU qui y entreront jusqu'à ce que le dernier CPU fasse fonctionner la barrière. A partir de ce moment, tous les processeurs fonctionnent à nouveau.

Répondre

5

Vous pouvez probablement obtenir un comportement équivalent en utilisant une fin:

struct fake_barrier_t { 
    atomic_t count; 
    struct completion comp; 
} 

/* run before each pass */ 
void initialize_fake_barrier(struct fake_barrier_t* b) 
{ 
    atomic_set(&b->count, 0); 
    init_completion(&b->comp); 
} 

/* make all tasks sleep until nth arrives, then wake all. */ 
void fake_barrier(struct fake_barrier_t* b, int n) 
{ 
    if (atomic_inc_return(&b->count) < n) 
    wait_for_completion(&b->comp); 
    else 
    complete_all(&b->comp); 
} 
+0

+1 bonne réponse. Je pensais à quelque chose comme ça, mais vous l'avez réellement mis en œuvre. –

+0

Très agréable; C'est en fait une façon propre de mettre en place des barrières. –

2

Je ne suis pas familier avec la construction pthread_barrier(), mais le noyau a un grand nombre d'options pour les barrières de mémoire.

Voir lxr memory barriers pour la documentation

Si vous essayez de forcer un ensemble de fils à attendre les uns des autres, vous pouvez probablement pirater quelque chose ensemble avec mutex et/ou files d'attentes - mais je ne sais pas quand vous voudriez faire ça. Quand voulez-vous que les threads vous attendent? Je suis très curieux maintenant ...

+0

pas barrière de mémoire (wmb, mb, rmb), mais une barrière synhro – osgx

+0

mais thnx pour LXR mem bar lien. – osgx

+0

+1 pour le lien –