multithread , sémaphore, linux : endormir un thread. - C - Programmation
Marsh Posté le 13-11-2003 à 11:43:53
xilebo a écrit : salut, |
man ipc
les liens vers les msgxxx(), les semxxx() et les shmxxx() tu suivras
ton bonheur trouveras
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.
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
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....
Marsh Posté le 14-11-2003 à 00:10:14
BJOne a écrit : |
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 :
|
(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 :
|
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 :
|
le second parametre est une structure
Code :
|
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 ?
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
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 ?