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 :

Problème Programmation avec Pthreads


Sujet :

Threads & Processus C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut Problème Programmation avec Pthreads
    Bonjour,
    j'essaye de me progresser un peu dans le développement c++ en utilisant les programations multi-threads. J'essaye de compiler ce programme pour tester les mutex sous linux mais ça marche pas (j'ai trouvé l'exemple sur un site):
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
     
    void *functionC();
    pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
    int  counter = 0;
     
    main()
    {
       int rc1, rc2;
       pthread_t thread1, thread2;
     
       /* Create independent threads each of which will execute functionC */
     
       if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
       {
          printf("Thread creation failed: %d\n", rc1);
       }
     
       if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )
       {
          printf("Thread creation failed: %d\n", rc2);
       }
     
       /* Wait till threads are complete before main continues. Unless we  */
       /* wait we run the risk of executing an exit which will terminate   */
       /* the process and all threads before the threads have completed.   */
     
       pthread_join( thread1, NULL);
       pthread_join( thread2, NULL); 
     
       exit(0);
    }
    void *functionC()
    {
       pthread_mutex_lock( &mutex1 );
       counter++;
       printf("Counter value: %d\n",counter);
       pthread_mutex_unlock( &mutex1 );
    }
    L'erreur que je reçoit est la suivante:
    user@ubuntu:~/Bureau/Tests Threads/Exemple_threads_mutex$ g++ -lpthread exemple_threads_mutex_1.c
    exemple_threads_mutex_1.c: In function ‘int main()’:
    exemple_threads_mutex_1.c:16: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
    exemple_threads_mutex_1.c:16: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
    exemple_threads_mutex_1.c:21: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
    exemple_threads_mutex_1.c:21: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
    user@ubuntu:~/Bureau/Tests Threads/Exemple_threads_mutex$
    Est ce que vous pouvez m'aider pour trouver la solution svp ?

    Une autre question que je voulais poser: dans cet exemple, est ce que chaque thread tourne sur un coeur ?? ou bien c'est le Système d'exploitation qui décide ?
    Ci c'est le cas, comment je peux forcer un thread à tourner sur un deuxième coeur?

    Merci beaucoup

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    je ne sais pas comment; mais j'ai trouvé la solution, j'ai mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void *functionC(void *); au début du programme après les include
     
    void *functionC(void *dummy)
    {
       pthread_mutex_lock( &mutex1 );
       counter++;
       printf("Counter value: %d\n",counter);
       pthread_mutex_unlock( &mutex1 );
    }
    mais pourquoi je suis obligé de mettre void * malgrès que ma fonction ne prend rien comme entrée
    Merci

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La fonction que tu passes à pthread_create doit prendre un paramètre de type void*, tu n'as pas le choix. C'est ce type là de fonction que pthread_create attend en paramètre comme point d'entrée pour le thread.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par TSUS86 Voir le message
    Une autre question que je voulais poser: dans cet exemple, est ce que chaque thread tourne sur un coeur ?? ou bien c'est le Système d'exploitation qui décide ?
    Tu n'as aucune garantie à ce niveau-là, c'est l'OS qui gère ça (plus ou moins bien suivant l'OS, d'ailleurs).

    Citation Envoyé par TSUS86 Voir le message
    Ci c'est le cas, comment je peux forcer un thread à tourner sur un deuxième coeur?
    Via le réglage de l'affinité processeur.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    Merci pour votre aide.
    J'ai pu controlé l'affinité du processeur en controlant les process qui tournent tout en utilisant "taskset" sur UBUNTU. De même j'ai pu controler les threads dans un programme C++ en utilisant "pthread_setaffinity_np" ... Mon ami utilise QT pour lancer des threads, est ce que vous savez comment régler l'affinité du processeur en utilisant QT ?

    Merci en avance

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par TSUS86 Voir le message
    Mon ami utilise QT pour lancer des threads, est ce que vous savez comment régler l'affinité du processeur en utilisant QT ?
    Voir sur le forum Qt.

  7. #7
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    Citation Envoyé par TSUS86 Voir le message
    mais pourquoi je suis obligé de mettre void * malgrès que ma fonction ne prend rien comme entrée
    Merci
    Citation Envoyé par Laurent Gomila Voir le message
    La fonction que tu passes à pthread_create doit prendre un paramètre de type void*, tu n'as pas le choix. C'est ce type là de fonction que pthread_create attend en paramètre comme point d'entrée pour le thread.
    oui, la fonction toplevel d'un thread prend un argument fournis lors du lancement par pthread_create, mais c'est pas pour embêter comme le ton de vos remarques le laisse supposer, il peut être très pratique de passer un contexte au nouveau thread
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/10/2019, 14h58
  2. Problème des 8 queens avec pThreads
    Par Denar dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 15/02/2011, 23h58
  3. Réponses: 8
    Dernier message: 06/10/2010, 10h45
  4. Problème de programmation avec VB.Net
    Par monster74 dans le forum VB.NET
    Réponses: 3
    Dernier message: 02/09/2010, 12h14
  5. Réponses: 0
    Dernier message: 30/04/2009, 10h17

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