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

Threads & Processus C++ Discussion :

Segmentation fault sur mutex!


Sujet :

Threads & Processus C++

  1. #1
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut Segmentation fault sur mutex!
    Salut,

    petit souci de compilation. Je veux mettre en place un mutex sur un objet de communication qui est partagé par plusieurs thread. Jusque la, pas de souci. Jusqu'avant, je mettais un simple flag true/false pour gérer mes écriture concurente. Mais autant faire juste, et passer par un mutes.

    Bref, je remplace le tout par un mutex, je tente, et... Ben je me récupère un segmentation fault quand je lance le programme (qui se traduit par un "No source available for "pthread_mutex_lock() " " quand je fais du debug depuis Eclipse...

    Voici 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Queue::Queue() {
    	// TODO Auto-generated constructor stub
    	this->start_list = 0;
    	this->end_list = 0;
    	this->mutex = PTHREAD_MUTEX_INITIALIZER;
    }
     
    /**
     * Destructor function
     * @return void
     */
    Queue::~Queue() {
    	// TODO Auto-generated destructor stub
    }
     
    /**
     * send message function. write message on msg list
     * @param msg *message pointer where to insert message
     * @return bool Return true if finish, false if error
     */
    bool Queue::send_msg( msg * message ){
     
    	pthread_mutex_lock (& this->mutex);
    	int pos;
     
    	if( ( this->end_list + 1 != this->start_list ) &&
    	 ( ! ( ( this->end_list == MSG_NBR_MAX ) && ( this->start_list == 0 ) ) ) )
    	{
     
    		//if(this->end_list != MSG_NBR_MAX )
    			pos = this->end_list;
    	//	else
    	//		pos = 0;
     
    		this->list_msg[pos].cmd_id = message->cmd_id;
    		this->list_msg[pos].urgent = message->urgent;
    		this->list_msg[pos].lenght = message->lenght;
    		this->list_msg[pos].sender_id = message->sender_id;
     
    		for(unsigned int i = 0; i < 3; i++)
    			this->list_msg[pos].msg_id[i] = message->msg_id[i];
     
    		for(unsigned int i = 0; i < message->lenght; i++)
    			this->list_msg[pos].params[i] = message->params[i];
     
    		if(this->end_list != MSG_NBR_MAX - 1 )
    			this->end_list++;
    		else
    			this->end_list = 0;
    	}
    	pthread_mutex_unlock (& this->mutex);
     
    	return true;
    }
    Et mon mutex est bien déclaré dans mon .h

    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
    class Queue {
    private:
    	msg list_msg[MSG_NBR_MAX];
    	pthread_mutex_t mutex;
    	int start_list;
    	int end_list;
     
     
    public:
    	Queue();
    	virtual ~Queue();
     
    	bool send_msg(msg * message);
    	bool get_msg(msg * message);
    	int get_nbr_msg();
     
    };
     
    #endif /* QUEUE_H_ */
    L'un de vous aurait une idée? C'est vraiment au moment d'entrer dans send_msg() que je pars en segmentation fault.

    Je vois pas ce que j'ai fait de faux...

    Merci.
    Onet

  2. #2
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Petite mise à jour.

    A priori, il faudrait utiliser
    pthread_mutex_init(&this->mutex,NULL);
    au lieu de l'initialisations statique. J'ai donc fait la modif, mais sans aucus succès, ca compile, mais part toujours en segmentation fault

    Onet

  3. #3
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Merci Valgrind...

    C'est sur que si je veux attaquer mon objet AVANT d'avoir fait un new, ca va pas le faire...

    ### de compilateur qui est pas foutu de me dire que j'ai pas initialiser mon objet avant de vouloir bosser dessus...

    Désolé pour le bruit.
    Onet

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

Discussions similaires

  1. Segmentation fault sur mon serveur
    Par zoullou dans le forum Administration système
    Réponses: 2
    Dernier message: 06/04/2007, 10h17
  2. Segmentation fault sur script PHP
    Par zoullou dans le forum Langage
    Réponses: 1
    Dernier message: 03/04/2007, 09h32
  3. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 00h29
  4. Segmentation Fault sur un fclose
    Par Beush dans le forum C
    Réponses: 9
    Dernier message: 30/11/2005, 19h30
  5. Segmentation fault sur un gethostbyname ?
    Par Mitox dans le forum Réseau
    Réponses: 9
    Dernier message: 25/11/2005, 16h17

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