IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèque standard C Discussion :

Utilisation de sémaphore dans plusieurs fonctions imbriquées


Sujet :

Bibliothèque standard C

  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation de sémaphore dans plusieurs fonctions imbriquées
    Bonjour à tous,

    j'aurais une petite question concernant l'utilisation des sémaphores, pas vraiment au niveau de l'écriture, mais je cherche la manière de les utiliser au moins dans un cas spécifique.


    Mettons que j'ai une fonction verif(), qui me permet de vérifier si une valeur est bien présente dans une mémoire partagée.
    Mettons, à côté de cela, que j'ai une fonction ecriture() qui, si une donnée spécifique existe bien dans la mémoire partagée, écrit dans cette mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int verif(){
         SEM_WAIT
                      ...... // traitement vérification
         SEM_SIGNAL
     
         return valeur;
    }
     
    void ecriture(){
         SI verif RENVOIE Vrai
              SEM_WAIT
                   ....... // traitement ecriture
              SEM_SIGNAL
    }
    Le soucis qui se pose ici, je pense, c'est que si par un malheureux hasard, le programme se fait couper pile au moment après la vérification du SI (dans ecriture()) et avant le SEM_WAIT, et que le processeur lance un autre processus qui lui va se connecter sur la mémoire partagée et la modifier, cela va rendre ma fonction de vérification obsolète...

    Du coup, je me suis dit que je pouvais augmenter la taille de la section critique, et mettre le SEM_WAIT avant le SI, mais dans ce cas je fais double-emploi avec le sémaphore présent dans la fonction verif(), qui restera alors bloqué...

    Comment s'en sortir ?
    J'ai pensé.. Dans ecriture(), avant le SEM_WAIT, faire une vérification du pid du dernier processus ayant modifié le sémaphore, et si différent du processus en cours, faire un lngjmp juste avant la fonction de vérification, pour la relancer et être sûr d'avoir les valeurs à jour.
    Mais j'avoue que, bien que cela me paraisse correct, ça ne me semble pas être une "bonne" manière de faire.

    Auriez-vous une idée pour me venir à la rescousse ?

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour ce genre de chose, on peut factoriser le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    static int internal_verif()
    {
    	int valeur;
    	...... // traitement vérification
    	return valeur;
    }
     
    int verif(){
    	int valeur;
    	SEM_WAIT
    	valeur = internal_verif();
    	SEM_SIGNAL
    	return valeur;
    }
     
    void ecriture(){
    	SEM_WAIT
    	SI internal_verif RENVOIE Vrai
    	{
    		....... // traitement ecriture
    	}
    	SEM_SIGNAL
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Hum...
    je n'avais pas du tout pensé à ça !

    Cela me semble une bonne idée effectivement, je vais me pencher dessus et voir si le résultat est à la hauteur de mes espérances.

    Merci beaucoup Sieur Médinoc.

Discussions similaires

  1. [C#]Comment utiliser un dataset dans plusieurs...
    Par Sonny dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/11/2005, 14h03
  2. Utilisation de variables dans plusieurs classes
    Par dedeloux dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2005, 17h25
  3. utilisation de getdate() dans une fonction ?
    Par devdev dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/03/2005, 17h40
  4. Utilisation de Getdate dans une fonction
    Par BaronSamdi dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/11/2004, 10h12
  5. [VB.NET] Variable visible dans plusieurs fonctions ?
    Par Webman dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/05/2004, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo