Page principale   Modules   Liste des composants   Liste des fichiers   Composants   Déclarations  

Interface de gestion de threads
[Interface FRED]

Ce module définit comment créer des threads, terminer un thread ou un programme concurrent et connaitre le thread courant. Plus de détails...

Définitions des macros

#define FredTHREAD_NIL   (FredThread)NIL
 Définition du thread inexistant.


Définitions des types

typedef void *(* FredRunnable )(void *)
 Le type d'une procédure initiale de thread.

typedef FredThreadDescFredThread
 L'identité d'un thread est un pointeur sur son descripteur.

typedef FredList FredQueue
 Définition du type queue de threads.


Fonctions

FredThread FredThreadSpawn (int stacksz, FredRunnable function, void *arg, void **resref)
 Création et lancement d'un thread.

void FredThreadExit (void *res)
 Terminaison immédiate du thread courant.

void FredThreadYield ()
 Le thread courant passe la main à un autre thread.

FredThread FredThreadCurrent ()
 Rend l'identité du thread courant.


Description détaillée

Pour savoir comment l'utiliser, voir Gestion des threads et Les N philosophes

Documentation de la macro

#define FredTHREAD_NIL   (FredThread)NIL
 



Implantation

C'est un simple alias du pointeur nul de cellule de liste


Documentation du type

typedef FredList FredQueue
 



Implantation

C'est un simple alias d'une liste.


Documentation de la fonction

FredThread FredThreadCurrent  
 

Renvoie :
l'adresse du descripteur du thread actif


Implantation

00498 {
00499   return current;
00500 }

void FredThreadExit void *    res
 

Paramètres:
res  adresse du résultat du calcul du thread


Implantation

On rend le résultat à l'endrioit défini au mau moment de la création du thread par FreedThreadSpawn() . Le thread est mis dans la file des décédés pour que sa mémoire soit libérer par leon

00438 {
00439   FredThread old;
00440   FredCountDownStop();/* arrêt décomptage */
00441   /* mettre le résultat à l'endroit demandé */
00442   if(current->resref)*(current->resref)=res; 
00443   FredMaskOn();/* début d'exclusion mutuelle */
00444   /* réveil de leon */
00445   FredThreadWakeUp(&leonQ);
00446   /* 
00447     un thread ne peut libérer la mémoire
00448     dans laquelle il s'exécute. Il délègue cela 
00449     a leon  en s'inscrivant dans la
00450     file des threads défunts
00451   */
00452   FredThreadSuspend(&deadQ);
00453   /* on ne revient jamais ici */
00454   FredAbort(" erreur fatale dans threadDie");
00455 }

FredThread FredThreadSpawn int    stacksz,
FredRunnable    function,
void *    arg,
void **    resref
 

Paramètres:
stacksz  taille de pile exigée pour le thread
function  fonction à exécuter par le thread
arg  adresse de l'argument de la fonction
resref  Si l'adresse resref est non nulle, on y mettra l'adresse du résultat de la fonction lorsque le thread créé terminera.
Renvoie :
l'adresse du descripteur du thread créé ou FredTHREAD_NIL (0)


Implantation

On alloue la mémoire pour un descripteur de thread et la pile (éventuellement arrondi ). Si cette étape est franchi avec succès, on initialise le descripteur du thread ( FredThreadDesc ) et son contexte. On l'insère enfin dans la file des prêts readyQ en incrémentant le nombre de threads vivants nbFredThreads .

00393 {
00394   FredThread nw;
00395   /* allocation d'un descripteur de thread si possible */
00396   nw= FredNEW(FredThreadDesc) ;
00397   if(!nw) return nw;
00398   /* calcul taille de pile */
00399   nw->stacksz=FredSTACK_SIZE(stacksz); 
00400   /* allocation de la pile  si possible */
00401   if(!(nw->stack=(char*)FredAtomicAlloc(nw->stacksz))) { 
00402     /* plus de mémoire */
00403     FredDELETE( nw); return FredTHREAD_NIL;
00404   }
00405   /* initialisation du descripteur */
00406   nw->err=0; /* init errno à OK */
00407   nw-> entry=function; /* fonction à exécuter */
00408   nw->val=arg; /* son argument */
00409   nw->resref=resref; /* où mettre le résultat */
00410   /* initialisation du contexte processeur du thread */ 
00411   FredContextInit(nw->ctx,
00412       FredMAKE_SP(nw->stack,nw->stacksz),
00413       FredThreadHarness);
00414   FredMaskOn();/* début d'exclusion mutuelle */
00415   FredQueuePutLast(&readyQ,nw);/* réveil du nouveau thread */
00416   nbFredThreads++; /* un thread de plus !! */
00417   FredMaskOff();/* fin d'exclusion mutuelle */
00418   return nw;
00419 }

void FredThreadYield  
 



Implantation

00466 {
00467   FredThread old;
00468   FredMaskOn(); /* début d'exclusion mutuelle */
00469   current->err=errno; /* sauver errno */
00470   FredCountDownStop();/* arrêt décomptage */
00471   old=current;
00472   /* le courant se met en queue des prêts */
00473   /* on tire un nouveau courant */
00474   FredQueuePutLast(&readyQ,current);
00475   current=FredQueueGetFirst(&readyQ);
00476   /* traiter le cas d'un unique thread actif : rien faire */
00477   if(current!=old)FredContextSwitch(old->ctx,current->ctx);
00478   /* 
00479     on reviendra ici lors de son réveil :
00480     on relance le décomptage du quantum
00481   */
00482   FredCountDownStart(quantum);/* lancer décomptage */
00483   errno=current->err;/* restaurer errno */
00484   FredMaskOff();/* fin d'exclusion mutuelle */
00485 }


Généré le Mon Jan 5 16:22:06 2004 par doxygen1.2.17