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

ASP.NET Discussion :

Accès concurrent à un traitement


Sujet :

ASP.NET

  1. #1
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut Accès concurrent à un traitement
    Bonjour,

    Je souhaiterais verrouiller l’accès à un bloc de code, en effet, j'ai développé une petite application avec asp.net / c#

    J'ai un bloc de code (traitement assez long) qui ne devrait être exécuté que par un seul client à la fois. Pour cela j'ai pensé à utiliser les mutex, donc dans ma page asp j'ai fait un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected void Page_Load(object sender, EventArgs e)
    {
    System.Threading.Mutex m = new System.Threading.Mutex();
    m.WaitOne(-1);
    monTraitement();
    m.ReleaseMutex();
    }
    je pense que ça pose problème, en fait dans ce cas là chaque client qui exécute ce code il crée une instance du MUTEX du coup chaque client a son propre mutex (pas une variable partagée) donc il ne y aura jamais de blocage ! je me trompe ?

    Merci pour votre aide.

  2. #2
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Les mutex sont utilisés pour la sychronisation inter processus. Pour un seul process tu peux utiliser le mot clé lock.

    MSDN fourni des bons exemples sur la synchronisation
    http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx

  3. #3
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    Oui pour le Lock aussi j'aurai le même problème

    En fait le Lock fait sa vérification par rapport à une variable object, donc ce que l'on fait généralement c'est :

    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
     
    object obj = new object();
     
    //Création du thread 1 qui fait appel à maSectionCritique
    //Création du thread 2 qui fait appel à maSectionCritique
     
    Lock(obj)
    {
    //démarrer thread 1
    //démarrer thread 2
    }
     
    static void maSectionCritique()
    {
     //code ...
    }
    Mais par contre ce que j'ai fait, j'ai mis le verrou dans la page qui contient la section critique et compris la variable " obj " donc chaque client de mon application web reinstancie l'objet " obj " donc le client ne se mettra jamais en attente !
    En fait en utilisant les thread ça donne quelque chose du genre :
    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
     
     
    //Création du thread 1 qui fait appel à maSectionCritique
    //Création du thread 2 qui fait appel à maSectionCritique
     
    //démarrer thread 1
    //démarrer thread 2
     
     
    static void maSectionCritique()
    {
      object obj = new object();
      lock(obj)
      {
       //code ...
      }
    }
    et dans ce cas là il y aura aucun thread en attente !!

    Comment je pourrai résoudre ça avec mes clients web ?

    merci,

  4. #4
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Utilise un objet statique pour lock

  5. #5
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    Tu veux dire je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static object obj;
    protected void Page_Load(object sender, EventArgs e)
    {
      Lock(obj)
      {
        //section critique ...
      }
    }
    Dans ce cas, le deuxième client ne va pas réinitialiser la variable obj ?

  6. #6
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Yep

  7. #7
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    Une question dans le commentaire ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static object obj;  //<<< Quand le deuxième client exécute cette ligne, il ne réinitialise pas son contenu ?
    protected void Page_Load(object sender, EventArgs e)
    {
      Lock(obj)
      {
        //section critique ...
      }
    }

  8. #8
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Tu pourras trouver quelques exemples ici: http://www.developpez.net/forums/d12...ultithreading/

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Citation Envoyé par ralf91 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static object obj;  //<<< Quand le deuxième client exécute cette ligne, il ne réinitialise pas son contenu ?
    Cette ligne n'exécute rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    static readonly object obj = new object();
    protected void Page_Load(object sender, EventArgs e)
    {
      lock(obj)
      {
        //section critique ...
      }
    }
    Avec readonly tu es sûr que personne ne viendra modifier le contenu de obj. En déclarant obj static, l'instance sera la même pour tous les clients et donc l'objet locké sera toujours le même.

  10. #10
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut
    Merci pour vos réponses,

    Une dernière question, si le client qui est dans la section critique se bloque au milieu du traitement donc il n'arrive pas jusqu'à la fin du Lock, les autres client restent toujours en attentes ?

    je sais pour les Mutex on peut préciser le temps d'attente, mais pour les locks je ne sais pas comment ça se passe pour gérer l'attente bornée ?

    Merci encore,

  11. #11
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Une dernière question, si le client qui est dans la section critique se bloque au milieu du traitement donc il n'arrive pas jusqu'à la fin du Lock, les autres client restent toujours en attentes ?
    Le principe est qu'une section critique doit être suffisament courte et bien "bordée" afin de ne pas bloquer longuement ou définitivement les autres thread.

    Si ce n'est pas le cas, il y a un problème de conception : on doit juste rentrer dans la section critique pour tester/positionner un flag et en fonction du résultat lancer le traitement critique ou attendre le flag un certain temps et gérer le timeout. En cas de time-out, if faudrait pouvoir stopper le thread utilisant le traitement critique et resetter le flag.

  12. #12
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Citation Envoyé par ralf91 Voir le message
    si le client qui est dans la section critique se bloque au milieu du traitement donc il n'arrive pas jusqu'à la fin du Lock, les autres client restent toujours en attentes ?
    A la place du lock tu peux utiliser Monitor.TryEnter
    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
    bool acquiredLock = false;
     
    try
    {
        Monitor.TryEnter(lockObject, 500, ref acquiredLock);
        if (acquiredLock)
        {
            // Code that accesses resources that are protected by the lock.
        }
        else
        {
            // Code to deal with the fact that the lock was not acquired.
        }
    }
    finally
    {
        if (acquiredLock)
        {
            Monitor.Exit(lockObject);
        }
    }

Discussions similaires

  1. accés concurrent à une table
    Par shout dans le forum Oracle
    Réponses: 5
    Dernier message: 06/10/2005, 10h54
  2. Réponses: 22
    Dernier message: 25/08/2005, 16h03
  3. Lenteur et acces concurrent
    Par JeanMarc_T2k dans le forum Bases de données
    Réponses: 7
    Dernier message: 04/12/2004, 20h57
  4. acces concurrent avec delphi 5 entreprise
    Par Jean_paul dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2004, 20h19
  5. [EJB] Accès concurrents à la base de données
    Par cameleon2002 dans le forum Java EE
    Réponses: 10
    Dernier message: 23/09/2003, 11h31

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