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

Langage C++ Discussion :

pthread qui marche.. pas trop


Sujet :

Langage C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut pthread qui marche.. pas trop
    bonjour
    je tente d'utiliser la fonction pthread_cond_wait
    mais ça me parait plutôt opaque (et surtout ça marche pas fort)

    j'ai le code suivant
    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
     
    pthread_mutex_t seq_mutex = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t seq_var = PTHREAD_COND_INITIALIZER;
    void wait() {
    	cout << "* debut wait" << endl;
    	pthread_mutex_lock(&seq_mutex);
    	cout << ">>>>> signal " << endl;
    	pthread_cond_signal(&seq_var);
    	//pthread_mutex_unlock(&seq_mutex);
    	cout << "* fin wait" << endl;
    }
    void *functionSequement(void *seq) {
    	int i = 0;
    	cout << "- function " << i++ << endl;
    	wait();
    	cout << "- function " << i++ << endl;
    	wait();
    	cout << "- function " << i++ << endl;
    	wait();
    	cout << "- function " << i++ << endl;
    	wait();
    	cout << "- function " << i++ << endl;
    	wait();
    	cout << "- function  " << i++ << endl;
    }
    avec pour l’exécution
    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
     
    if (true) {
    	cout << endl << "* sequencement" << endl;
    	pthread_t thread1;
     
    	pthread_mutex_lock(&seq_mutex);
    	pthread_create(&thread1, NULL, functionSequement, NULL);
    	sleep(2);
    	while (true) {
    		cout << "entrez un caractere ";
    		char c;
    		cin >> c;
    		if (c == 'q')
    			break;
    		if (c == 'x') {
    			cout << "    Attente condition var" << endl;
    			pthread_cond_wait(&seq_var, &seq_mutex);
    			cout << "    Fin attente condition var" << endl;
    		}
    	}
    	cout << " FIN SAISIE" << endl;
    	pthread_join(thread1, NULL);
    }
    le code pthread_cond_wait libere bien le mutex la premier fois mais on se sort jamais du pthread_cond_wait
    j'ai bien tenté de mettre dans le wait() la ligne pthread_mutex_unlock(&seq_mutex);
    mais après on ne retombe pas sur le blocage du mutex et ça donne n'importe quoi

    en fait ce que j'aimerais avoir c'est avec un seul mutex
    - blocage du wait() sur ce mutex
    - pthread_cond_wait libere le mutex
    - dans wait() on signal qu'on a transité
    j'ai tenté tout un tas de configuration mais ca marche pas

    en gros je veux bloquer tout le temps le wait et juste avoir une notification dans le thread main que deblocage c'est bien fait
    c'est pour une sorte de séquenceur

    merci
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je dirais qu'il ne faut pas faire un lock, avant le signal. Mais je dois dire que les conditions de pthreads, j'ai trop du mal
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    merci mais ca m'aide pas beaucoup
    ceci étant j'ai aussi d'autres problèmes avec le polymorphisme et les thread ....
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je trouve aussi que cette lib ne marche pas très bien. :/

    Mais bon ce n'est pas la seule...

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Si, elle fonctionne très bien, encore heureux. Sinon, va falloir avoir des arguments solides (aka : un programme minimaliste pour prouver un bogue).

    @ikeas : je n'aide pas beaucoup, car c'est dur à voir ce qui se passe, combien de fois est appelé votre code et ainsi de suite. De plus, vous ne nous donnez pas non plus la sortie. Avez-vous testé ce que j'ai dit ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ouais il me faudrait un code minimaliste, mais, j'ai déjà eu des threads qui ne s'arrêtaient pas, des threads qui ne démarraient pas, des threads qui s'arrêtent avant le thread main (même avec les fonctions join et companie), ...

    Bref si tu n'utilises que deux threads ça va mais une fois que tu utilises plusieurs threads avec des conditions de variables comme c'est le cas ici cette lib ne marche pas très bien. :/

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ce n'est pas que ca marche pas bien, mais que tu ne l'utilises pas correctement.

    Quand quelqu'un ne parviens pas à obtenir un résultat, c'est qu'il fait mal les choses.
    On ne peut commencer à accuser l'outil que lorsque d'autres personnes, travaillant indépendamment de soi, ont les mêmes problèmes.

    Il suffit d'utiliser l'outil de la manière dont il a été pensé.

    Pour reprendre la comparaison classique, parce que tu as du mal à enfoncer un clou en tapant dessus avec un tournevis, il ne faut pas en déduire que le tournevis n'est pas bon.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je ne suis pas le seul à utiliser pThread..., et avoir ce genre de problèmes. :o

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Effectivement la programmation multi-threadée ce n'est pas pour des Mickeys ou ou

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    S'il vous plait, j'aimerai que l'on revienne sur le problème de ikeas, notamment car j'ai utilisé les condition s de pthread et que j'avais mis un certain temps à comprendre (notamment comment les lock des mutext associés sont gérés ). Merci.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Peut être pourrait t-il gérer pthread à travers la nouvelle monture du c++14, je trouve qu'elle est déjà plus simple à utiliser que pthread qui est en C. :/ (Ca t'éviteras les problèmes du genre spurious wake-up présent sur les multi-coeurs)

    Logiquement tu es sensé attendre sur ta condition avec un thread sur ton mutex, et quand le thread à fini, tu réveilles les autres threads mis en attente.

    Je ne vois pas de notify, nulle part, tu en aurais pas oublié un par hasard de ce fait tes autres threads ne se réveille jamais ?

Discussions similaires

  1. script qui marche pas...
    Par jpg dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/10/2004, 14h19
  2. requete(jointure 2 tables) qui marche pas
    Par DaxTaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2004, 17h50
  3. une comparaison qui marche pas.
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 16/02/2004, 15h59
  4. [LG]Split qui marche pas
    Par macluvitch dans le forum Langage
    Réponses: 3
    Dernier message: 30/11/2003, 18h19
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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