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 Discussion :

souci de mutex


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut souci de mutex
    Bonjour,

    Utilisant la librairie portable pthread:
    http://emmanuel-delahaye.developpez....#helloworlds_1

    J'ai voulu protégé le lancement de thread par une variable Status.

    Bien qu'il s'agisse de code C++, je poste ceci sur ce forum car je considère que pthread est du C.

    Le code d'appel est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    string run(const string action, char* strAutomat)
    {
    	if (getStatus() != S_WORKING)
    	{
                 setStatus(S_WORKING);
    	     // Start Thread of opening
                 pthread_t ta;
    	     pthread_create (&ta, NULL, staticOpenCall, strAutomat);
        }
    	return status;
    }
    La protection par mutex est simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void setStatus(const string newStatus)
    {
        pthread_mutex_lock (&mutexStatus);
        status = newStatus;
        pthread_mutex_unlock (&mutexStatus);
    }
    Le mutex est correctement initialisé au démarrage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mutexStatus = PTHREAD_MUTEX_INITIALIZER;
    Le problème est que lorsque le thread se termine, il fait :

    (S_CLOSED n'est qu'une constante)

    Et là, lors de cette initialisation, j'ai une erreur d'accés mémoire dans la ligne
    pthread_mutex_lock() de setStatus().
    Il est à noter que cette fonction a été appelé précédement par Run() (voir plus haut) et que cela s'est bien passé.

    Je suis sous Windows XP, avec VisualC++ 2005 Express, mais ceci ne devrait pas entrer en compte car je souhaite faire du code portable.

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Peux tu montrer comment tu fais la déclaration du mutex (et a quel moment tu fais son initialisation) ?

    Sinon, j'ai une petite remarque a propos du code de la fonction run().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	if (getStatus() != S_WORKING)
    	{
                 setStatus(S_WORKING);
    	     // Start Thread of opening
                 pthread_t ta;
    	     pthread_create (&ta, NULL, staticOpenCall, strAutomat);
            }
    En toute rigueur, status peut être modifié entre getStatus et setStatus.
    Si tu veux vraiment protéger le lancement, il serait preferable de faire quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            pthread_mutex_lock (&mutexStatus);
    	if (status != S_WORKING)
    	{
                 status  = S_WORKING;
    	     // Start Thread of opening
                 pthread_t ta;
    	     pthread_create (&ta, NULL, staticOpenCall, strAutomat);
            }
            pthread_mutex_unlock (&mutexStatus);

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Voici le code de la déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            // Protection of status
            pthread_mutex_t mutexStatus;
    La protection du mutex proposée n'est pas idéale car le thread modifie la variable.
    Par contre, je peux adapter cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
         pthread_mutex_lock (&mutexStatus);
    	if (status != S_WORKING)
    	{
                 status  = S_WORKING;
            pthread_mutex_unlock (&mutexStatus);
    	     // Start Thread of opening
                 pthread_t ta;
    	     pthread_create (&ta, NULL, staticOpenCall, strAutomat);
            }
            else
            {
            pthread_mutex_unlock (&mutexStatus);
            }
    Des commentaires ?

  4. #4
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Finalement les mutex ont l'air de fonctionner.

    Il y a un souci ailleur...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Citation Envoyé par Bayard
    La protection du mutex proposée n'est pas idéale car le thread modifie la variable.
    Ben justement, il vaudrait mieux du coup protéger la fonction par un mutex, pour etre sur d'être dans un état cohérent à la sortie de la fonction.
    Je pense aussi que la mise à jour de status ne se fait pas au bon endroit, il faut verifier avant que le thread a bien été créé.

    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
     
     pthread_mutex_lock (&mutexStatus);
    	if (status != S_WORKING)
    	{
    	     // Start Thread of opening
                 int res;
                 pthread_t ta;
    	     res = pthread_create (&ta, NULL, staticOpenCall, strAutomat);
                 if (res==0)
                      status  = S_WORKING;
                 else
                     status = S_ERROR;
     
            }
            pthread_mutex_unlock (&mutexStatus);
    Si tu separes la declaration et l'initialisation, je te conseille plutot d'utiliser pthread_mutex_init, pour l'initialisation du mutex.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ASM + DELPHI ... soucis ... mais top intéressant !
    Par - Robby - dans le forum Langage
    Réponses: 9
    Dernier message: 21/11/2003, 15h58
  2. [langage] ptit souci de syntaxe
    Par marouanitos dans le forum Langage
    Réponses: 2
    Dernier message: 26/09/2003, 10h28
  3. [File et Directory ListBox] Soucis de filtre
    Par Mercilius dans le forum Composants VCL
    Réponses: 8
    Dernier message: 04/04/2003, 16h17
  4. Réponses: 4
    Dernier message: 16/02/2003, 12h16
  5. Réponses: 2
    Dernier message: 03/10/2002, 17h24

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