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 :

thread, mutex, etc


Sujet :

Threads & Processus C++

  1. #21
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Heuu en fait en regardant de plus pres j'ai modifié mon run ainsi :
    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
     
    virtual void run()
    	{
    		while(true)
    		{
     
    			_mutex->lock();
    			_condition->wait(_mutex);
     
    			flush();
     
    			_condition->broadcast();
    			_mutex->unlock();
     
    		}
    	}
    et j'ai ajouté dans mes acces en écriture situé dans les threads un signal()... certainement le signal qu'attendait mon wait()...

    Bref ça a l'air de tourner comme il faut à présent.
    Merci.

    Je pense que j'en ai terminé avec les threads, faute de quoi je viendrai dépoussierer le topic.

    Merci à tous de votre aide.

  2. #22
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Il y a une technique spécifique pour l'utilisation des variables de condition. Voila l'algo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mutex.lock();
    while(is_it_good_to_continue())  {
       condition.wait();
    }
    operation();
    mutex.unlock();
    Comme le mode de fonctionnement exact d'une variable de condition est soumis à interprétation (si je fais un signal puis juste après un wait je suis bloqué ou pas?) il vaut mieux se méfier. Cet algo permet de gérer tous les cas de figure, même si un signal() est effectué quand il n'aurait pas du.

    Par contre je comprends moyennement ta méthode broadcast. En admettant que ce soit un autre nom pour l'opération signal(), à quoi cela peut-il servir si le wait() et le signal() sont effectués par le même thread?

  3. #23
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    le wait() et le signal ne sont pas effectués par le meme thread... d'où ce broadcast() qui est un "signal()" à tous les threads en attente...

  4. #24
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Citation Envoyé par Ange_blond Voir le message
    le wait() et le signal ne sont pas effectués par le meme thread... d'où ce broadcast() qui est un "signal()" à tous les threads en attente...
    Donc le broacast c'est un signal... Dans les morceaux de code que tu nous as collé, c'est le même thread qui fait le wait et broadcast, ça n'a pas de sens. Ce qu'on désire quand on utilise une variable de condition c'est qu'un thread se retrouve bloqué et qu'un autre le libère.
    Tu n'as peut être pas collé tout ton code. Ce qu'il serait intéressant si tu veux qu'on puisse commenter ton code serait que tu nous désignes précisément les morceaux de code liés aux threads "lecteurs" et aux threads "écrivains" (ça n'a pas d'importance de savoir lequel initialise une ressource à la base ou lequel est le thread principal) ainsi que le nombre de ces threads des deux cotés (un ou plusieurs?).

  5. #25
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    heuu, he bien selon moi tout marche bien là, mais dans un soucis de comprendre tout oui voilà :

    Sur ma pile : Unique thread dont le run() 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
    virtual void run()
    	{
    		while(true)
    		{
     
    			_mutex->lock();
    			_condition->wait(_mutex);
     
    			flush();
     
    			_condition->broadcast();
    			_mutex->unlock();
     
    		}
    	}

    Qui accedent à la pile : plus de 150 threads (nombre variable) dont le code ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [...]
    _mutex->lock();
     
    addonstack(....);
     
    _mutex->unlock();
     
    _condition->signal();
    [...]
    Voilou.

  6. #26
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Remarque sans rapport direct avec ta question :
    Je ne sais pas ce que tu as comme machine, mais une appli de plus de 150 threads sur une architecture classique n'est probablement pas optimale, et va passer plein de temps à basculer d'un thread à l'autre.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #27
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Ha, la alors ça me semble correct.
    Néanmoins il me semble important de modifier le code de ton lecteur :
    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
    virtual void run()
    	{
    		while(true)
    		{
     
    			_mutex->lock();
                            while(stack_is_empty()) {
    			    _condition->wait(_mutex);
                            }
     
    			flush();
     
    			_condition->broadcast();
    			_mutex->unlock();
     
    		}
    	}
    Une variable de condition n'est pas à proprement parler une condition. C'est un dispositif qui permet de bloquer un thread jusqu'à ce qu'un autre décide de lui signaler que l'état d'une condition a potentiellement changé.
    Dans les tests que tu as effectué, tu as peut être eu de la chance mais selon moi ce n'est pas sensé fonctionner comme ça.
    Imaginons un cas comme un autre : un thread écrivain ajoute un seul objet à la liste et fait un signal, par la suite plus aucun nouvel objet ne sera ajouté. Ensuite ton thread lecteur fait un wait, il peut donc se retrouver bloqué éternellement suivant le comportement de l'api de thread utilisé, puisque plus aucun autre signal n'aura lieux. Pourtant il y a une donnée dans la liste -> donc c'est une erreur.

  8. #28
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    Imaginons un cas comme un autre : un thread écrivain ajoute un seul objet à la liste et fait un signal, par la suite plus aucun nouvel objet ne sera ajouté. Ensuite ton thread lecteur fait un wait, il peut donc se retrouver bloqué éternellement suivant le comportement de l'api de thread utilisé, puisque plus aucun autre signal n'aura lieux. Pourtant il y a une donnée dans la liste -> donc c'est une erreur.
    Certes, j'ai bien remarqué la chose, mais dans l'utilisation normale du programme, la pile ne risque pas de refroidir beaucoup... mais je vais néanmoins corriger ça pour que ce soit clean.

    Merci

    Citation Envoyé par JolyLoic
    Je ne sais pas ce que tu as comme machine, mais une appli de plus de 150 threads sur une architecture classique n'est probablement pas optimale, et va passer plein de temps à basculer d'un thread à l'autre
    La base des 150 thread avait déjà été mis en place avant que je commence à m'interesser à la synchro... cependant ils sont legers et sont aussi nombreux pour pouvoir lancer des telechargements simultanés, tout simplement... pas de soucis sur ma machine (puissante) ça tourne plutot bien :-)

    Merci à tous pour votre aide et vos conseils

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [boost::thread] [mutex] Threader une méthode
    Par Flob90 dans le forum Boost
    Réponses: 5
    Dernier message: 16/05/2009, 21h01
  2. multi-threads : mutex et conditons
    Par salseropom dans le forum C
    Réponses: 3
    Dernier message: 16/12/2007, 23h31
  3. Thread, Mutex et bug ^^
    Par Zenol dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 13/04/2007, 13h33
  4. threads & mutex
    Par keni dans le forum C
    Réponses: 3
    Dernier message: 23/02/2007, 17h53
  5. Librairie OO et portable pour RegExp, Thread, Sockets, etc..
    Par Swoög dans le forum Bibliothèques
    Réponses: 29
    Dernier message: 27/05/2006, 13h29

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