multithread , sémaphore, linux : endormir un thread.

multithread , sémaphore, linux : endormir un thread. - C - Programmation

Marsh Posté le 13-11-2003 à 11:32:12    

salut,
 
je dois implementer des semaphore sous linux (suite a des problemes rencontrés ) et dans l algo je vois qu il faut endormir le processus  appelant pour P()  , et reveiller le premier processus de la liste  (si il y en a ) pour V().
 
Les processus que j endors sont en fait des threads. Et je pense utiliser la fonction pause() pour endormir le thread.
 
Est ce une bonne solution ?
 
Et je n ai pas trouvé le signal pour reveiller un thread endormi avec pause(). Je sais qu il faut appeler la fonction signal() mais avec quels parametres ?
 
 
merci de votre aide.
 
 
PS : existe il une implementation des semaphores en C sous linux ?

Reply

Marsh Posté le 13-11-2003 à 11:32:12   

Reply

Marsh Posté le 13-11-2003 à 11:43:53    

xilebo a écrit :

salut,
 
je dois implementer des semaphore sous linux (suite a des problemes rencontrés ) et dans l algo je vois qu il faut endormir le processus  appelant pour P()  , et reveiller le premier processus de la liste  (si il y en a ) pour V().
 
Les processus que j endors sont en fait des threads. Et je pense utiliser la fonction pause() pour endormir le thread.
 
Est ce une bonne solution ?
 
Et je n ai pas trouvé le signal pour reveiller un thread endormi avec pause(). Je sais qu il faut appeler la fonction signal() mais avec quels parametres ?
 
 
merci de votre aide.
 
 
PS : existe il une implementation des semaphores en C sous linux ?


 
man ipc
les liens vers les msgxxx(), les semxxx() et les shmxxx() tu suivras
ton bonheur trouveras

Reply

Marsh Posté le 13-11-2003 à 11:46:34    

man semaphore aussi :D

Reply

Marsh Posté le 13-11-2003 à 13:49:52    

merci bien :) je vais voir ca. Apparemment de toutes facons pour que ce soit reellement efficace, il vaut mieux utiliser ces fonctions que tenter de les réimplémenter.

Reply

Marsh Posté le 13-11-2003 à 20:47:15    

P & V viennent de la description des sémphores faite par Dijkstra.
 
pas tapay si je dis des bêtises ;)

Reply

Marsh Posté le 13-11-2003 à 20:48:52    

xilebo a écrit :

merci bien :) je vais voir ca. Apparemment de toutes facons pour que ce soit reellement efficace, il vaut mieux utiliser ces fonctions que tenter de les réimplémenter.


 
surtout que t'as aucunes chances vu que c'est au niveau noyau que c'est géré et gérable....

Reply

Marsh Posté le 14-11-2003 à 00:10:14    

BJOne a écrit :


 
surtout que t'as aucunes chances vu que c'est au niveau noyau que c'est géré et gérable....


 
oui, c est bien ca le probleme.
 
Bon j en profite pour glisser une petite question.
 
J'ai bien reussi a creer ma semaphore en faisant  
 

Code :
  1. sem = semget(SEMAPHORE_DRAW,1,IPC_CREAT);


 
(la valeur retournée correspond a mon id semaphore, SEMAPHORE_DRAW est un define sur une valeur clé que j'ai fixé).
 
ensuite je fixe mon compteur sur ma sémaphore à 0 (c est bien 0 les sections critiques?)de la facon suivante  :
 

Code :
  1. semctl(sem,0,SETVAL,arg);


 
Cet appel reussit egalement (retour 0 ) .
 
 
Par contre pour appeler ma semaphore en section critique, je n'ai pas bien compris leur explication dans les pages man de semop
 

Code :
  1. semop(sem,&op,flag);


 
le second parametre est une structure  

Code :
  1. short sem_num;
  2. short sem_op;
  3. short sem_flg;


 
 
je ne vois pas quoi mettre dans sem_op pour une section critique.
 
De plus, le 3eme parametre n est pas decrit dans les pages man.
 
 
Quelqu un peut il m eclairer ?

Reply

Marsh Posté le 14-11-2003 à 00:39:25    

aloreure, je regarde mes docs (ça date, ça va faire longtemps que j'ai pas fait du nunux)
 
P() décrémente le compteur, si négatif le kernel mets le process/thread en attente
 
// section critique
 
P: semop avec sem_op à -1
V: semop avec sem_op à 1
 
le flags est à mettre 0, sinon y'a IPC_NOWAIT pour avoir un appel non bloquant...
 
V() incrémente le compteur, le kernel peut rendre la main à un autre process/thread

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed