2016-04-07 6 views
-1

Une structure fournie appelle ma fonction PartialCodec.Différencier les threads appelés par pthread

pthread_create(&(pcPthread[iTd]),NULL,PartialCodec,(void *)&pcMCData[iTd]); 

Je ne suis pas autorisé à modifier le code cadre. Cependant, à l'intérieur PartialCodec je veux assigner différentes tâches pour différents threads et donc je dois différencier entre chaque thread. Comment puis-je faire ceci?

+0

Il n'y a pas de secret ici. Vous avez deux façons simples de déterminer ce que fait le thread: Premièrement, l'argument 'void * (*) (void *)' détermine la fonction dans laquelle le thread commence, Two, le 'void *' détermine l'argument de cette fonction sera. – EOF

+0

Chaque thread passe automatiquement à la fonction PartialCodec et l'argument est le même pour tous les threads –

+1

Vous ne montrez pas tout votre code, mais nous supposons que «iTd» est différent pour chaque thread, ce qui signifie que chaque thread reçoit un pointeur différent à un élément de 'pcMCData'. – jxh

Répondre

0

Utilisez l'argument, Luc.

Vous transmettez &pcMCData[iTd] comme argument de thread.

Il suffit donc d'ajouter quelques champs à cette structure, indiquant au thread sur quelles tâches travailler. (Et évidemment définir ces champs avant de créer le fil)

pcMCData[iTd].thingToWorkOn = /* however you decide the thing to work on */; 
pthread_create(&(pcPthread[iTd],NULL,PartialCodec,(void *)&pcMCData[iTd]); 
+0

Cela fait partie de mon projet et j'ai reçu un ensemble de code que je ne devrais pas changer. Je ne peux écrire que dans la fonction PartialCodec. –

+0

Alors, peut-être est-il plus juste de dire: "Quelqu'un d'autre lance des threads en utilisant' pthread_create() '..." –

+0

Ouais, mon professeur a écrit le code pour lancer les discussions et je ne suis pas supposé le changer –

1

En supposant que vous savez combien de threads appelleront PartialCodec, vous pouvez utiliser static des variables dans la fonction pour faciliter la communication entre les threads. Un static nu permettrait à tous les threads dans PartialCodec de manipuler la même instance d'objet.

void * PartialCodec (void *arg) { 
    static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
    static struct state { 
     /* some state */ 
    } critical; 
    struct state local; 

    pthread_mutex_lock(&lock); 
    local = critical; /* make a local copy */ 
    /* update critical */ 
    pthread_mutex_unlock(&lock); 

    /* ... refer to local copy of state ... */ 
} 

Les pistes critical d'état qui une partie du problème un fil particulier devrait résoudre. La copie à local établit que le thread fonctionnera sur cette partie du problème. L'état critical est ensuite mis à jour afin que le thread suivant qui lit critical sache travailler sur une partie différente du problème.