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 :

Initiation à la programmation multitâche en C avec Pthreads [Tutoriel]


Sujet :

C

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Initiation à la programmation multitâche en C avec Pthreads
    http://franckh.developpez.com/tutoriels/posix/pthreads/

    Les threads permettent de créer des programmes multitâches, ce tutoriel vous propose une approche par la pratique en partant d'un exemple unique !
    Vous pouvez laisser un commentaire pour cet article à la suite.


    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2003
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Dans la 2e partie (mutex), il y'a une inversion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* Debut de la zone protegee. */
    pthread_mutex_lock (& store.mutex_stock);
     
    psleep (get_random (3));
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    psleep (get_random (3));
     
    /* Debut de la zone protegee. */
    pthread_mutex_lock (& store.mutex_stock);

  3. #3
    Membre habitué

    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 58
    Points : 166
    Points
    166
    Par défaut Lien PDF
    Bonjour,
    Merci beaucoup pour ce cours très clair.
    Juste une petite remarque : il y a une erreur dans l'adresse du PDF (il manque un '/').

  4. #4
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Un excellent tutoriel, surtout pour les novices de la programmation multi-threading. Merci !

  5. #5
    Expert confirmé Avatar de AoCannaille
    Inscrit en
    Juin 2009
    Messages
    1 413
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 1 413
    Points : 4 734
    Points
    4 734
    Par défaut
    Je viens de lutter contre un problème étrange pour mon initialisation de mutex.

    En effet PTHREAD_MUTEX_INITIALIZER ne peut être utilisé uniquement sur les variables statiques (ce qui n'était pas mon cas, malheureusement). Ce détail à son importance car, d'après pthread.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # define PTHREAD_MUTEX_INITIALIZER {{0,0,0,0,0,0,{0,0}}}
    Et donc le compilateur n'aime pas trop la première accolade et nous gratifie d'une erreur du type "Expected expression before `{'"

    La solution est tellement simple mais n’apparaît pas dans ce tuto : Il faut initialiser le mutex (non statique donc) avec
    pthread_mutex_init(&mutex, NULL);

    Je verrai donc bien un soit un petit complément d'introduction au chapitre sur les mutex, soit en première sous partie au même titre pthread_mutex_lock / unlock

    Super tuto sinon

  6. #6
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2017
    Messages : 1
    Points : 4
    Points
    4
    Par défaut Problème de réveil de thread
    Bonjour,

    En reprenant ce bon exemple, j'ai trouvé un souci.

    Dans le thread store, le réveil de tous les threads joueurs doit être réalisé, donc au lieu de l'appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_cond_signal (& store.cond_clients);
    c'est un appel à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_cond_broadcast(& store.cond_clients);
    qui doit être effectué.

    Stéphane

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Difficulté avec pthread_mutex_lock
    En lisant le tuto j'ai crue que pthread_mutex_lock ne pouvais être bloquant mais c'est pthread_mutex_trylock qui n'est pas bloquant .
    Cette premierre fonction permet de déterminer le début d'une zone critique. Son seul argument est l'adresse d'un mutex de type pthread_mutex_t. La fonction renvoie 0 en cas de succès ou se bloque en attendant la libération du mutex ou retourne l'une des valeurs suivante dans certain cas :

    EINVAL : mutex non initialisé.
    EDEADLK : mutex déjà verrouillé par un thread différent.

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/11/2020, 18h51
  2. Problème Programmation avec Pthreads
    Par TSUS86 dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 28/03/2010, 14h54
  3. Initiation à la programmation avec l'API Windows
    Par PIC16F877A dans le forum Débuter
    Réponses: 5
    Dernier message: 27/02/2010, 11h40

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