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

C++Builder Discussion :

Threads fonction


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 41
    Par d�faut Threads fonction
    Bonjour � tous

    je suis sous Builder 6.0

    voil� j'aimerais faire une fonction qui ajouterais une ligne dans un fichier pour faire un fichier log mais cette fonction est appell�e par plusieurs threads ... esque ca pose un pb si ... il arrivais que 2 threads appele la fonction en meme temps ? ou est ce que je doit l'empecher avec des evenements ou un mutex ? ( la ca a l'air de tourner sans mais bon ... )

    merci d'avance

  2. #2
    Membre exp�riment�
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Par d�faut
    Bonjour,

    dans ton cas l'utilisation d'une section critique ou d'une mutex est tr�s importante, parce tu risques de te retrouver avec un fichier dont le contenu est le m�lange des deux threads (si � un instant X les 2 l'ouvrent en m�me temps) !

    En r�gle g�n�rale, du moment o� une t�che peut �tre exc�cut�e par plusieurs threads, il faut prot�ger l'acc�s par une section critique.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 41
    Par d�faut
    merci de la reponse :

    hmm d'accord ca veut donc dire que une fonction peut etre execut� plusieur fois en meme temp par different threads ? donc je peut faire un truc 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
    18
    19
    20
    21
    void AddLog(AnsiString Message)
    {
       //Attendre que le Mutex soit Libre
       ...
     
       //Ajout de Message à la fin du fichier
       fstream FichierLog;
     
       FichierLog.open("LogFile.txt",ios_base::out|ios_base::app);
       if (!FichierLog)
       {
          ShowMessage("Impossible d'ouvrir le fichier log");
       }
       else
       {
          Message=AnsiString("\nle "+DateToStr(Date())+" a "+TimeToStr(Time())+" "+Message);
          FichierLog.write(Message.c_str(),Message.Length());
       }
       //Liberer le mutex
       ...
    }
    ?

    et je n'ai pas besoin de le faire a chqque appel de fonction comme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
       ...
       //Attendre que le Mutex soit Libre
       ...
     
       AddLog("Erreur");
     
       //Liberer le mutex
       ...
    ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Par d�faut
    Exact. Je dirai m�me que tu dois utiliser du code prot�g� dans AddLog() et non pas prot�ger de l'ext�rieur les appels � AddLog(). Cette deuxi�me m�thode est peu fiable car sensible aux erreurs (aux oublis surtout).

    NB : comme pour tous ce que touche aux allocations/lib�rations de ressources, il faut �tre attentif � garantir que toute ressource allou�e est lib�r�e. Ici, si tu acquiers un mutex, il faut �tre absolument s�r que tu le lib�res avant de quitter la m�thode. C'est � dire : avant n'importe quelle instruction return ou malgr� n'importe quelle lev�e d'exception.

    En cas de doute (surtout sur les exceptions), utiliser le principe RAI (resource acquisition is initialization). 8)

  5. #5
    Membre exp�riment�
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Par d�faut
    Bonjour,

    un conseil concernant l'utilisation des mutex et des sections critiques: Il faut toujours faire le Acquire et le Release dans un bloc Try/finally. Parce que si tu fais un Acquire et qu'apr�s t'as une exception, alors tu vas sortir de la m�thode sans avoir relach� la main.Oups...

    Donc en gros:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try
    {
      SectionCritique->Acquire();
      //Code...
    }
    __finally
    {
      SectionCritique->Release();
    }
    Bon courage

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 41
    Par d�faut
    merci pour votre aide je vois ce que j'ai a faire !
    Neo41 :
    Bon courage
    mici !!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    31
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 31
    Par d�faut
    NB : try / __finally fonctionne bien, mais __finally est une instruction native de Borland. Elle n'existe pas dans la norme du C++.
    Si vous voulez garantir un minimum de portabilit� (encore que... une fois sous Borland, si on utilise la VCL, on devient assez peu portable...), utiliser une classe enveloppe (sur le mod�le RAI dont je parlais plus haut) est simple et efficace :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Mutex; // un mutex quelconque à acquérir/libérer
    class MutexHandler { 
      public : 
      Mutex Handler( Mutex& m ) : m_mutex( m ) 
      { m_mutex.acquire(); }
      virtual ~MutexHandler() 
      { m_mutex.release(); }
      private : 
      Mutex& m_mutex;
    };
    Et comme utilisation :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void addLog() {
      ...
      // Tentative d'acquisition 
      MutexHandler mh( *( new Mutex ) );
      // Code éventuellemment susceptible de cacher un return ou une exception
      ...
    }
    L'appel � Mutex::release() se dont fait automatiquement et sans erreur possible en quittant la m�thode, quel que soit le point de sortie. 8)

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. thread, fonction et mutex ?
    Par AddicTion dans le forum D�buter
    R�ponses: 2
    Dernier message: 06/05/2010, 23h08
  2. thread fonction main
    Par ouiouioui dans le forum Langage
    R�ponses: 3
    Dernier message: 29/01/2009, 15h00
  3. R�ponses: 6
    Dernier message: 30/09/2005, 00h53
  4. [Threads] Sortir d'une fonction bloquante
    Par guejo dans le forum MFC
    R�ponses: 19
    Dernier message: 17/08/2004, 14h12
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    R�ponses: 6
    Dernier message: 01/03/2004, 01h15

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