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

POSIX C Discussion :

Pthread sur une pile


Sujet :

POSIX C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Pthread sur une pile
    Bonjour,

    J'aurais besoin d'un petit coup de main sur la liste chainée suivante, en fait je débute avec les pthreads, et je galère en particulier avec les fonctions pthread_cond_wait et pthread_cond_signal, je ne comprends pas bien ou les placer dans la fonction push pour réduire la charge cpu. A votre bon coeur.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
     
    struct list {
        int i;
        struct list *next;
    };
     
    struct list *init(void) {
        struct list *p = malloc(sizeof(struct list));
        p->i = 0;
        p->next = NULL;
        return p;
    }
     
    static struct list *stack = NULL;
    pthread_mutex_t zone = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t condition = PTHREAD_COND_INITIALIZER;
     
    static void print(struct list *p) {
        printf("%d %p\n", p->i, p->next);
    }
     
    void *push(struct list *p) {
        int i = 0;
        pthread_mutex_init(&zone, NULL);
        pthread_mutex_lock(&zone);
    	pthread_cond_init(&condition, NULL);
        while(i++ < 1000000) {
            stack = p;
            stack->i += 1;
            stack->next = init();
            print(stack);
    /*   	pthread_cond_signal(&condition);  */      
    /*  	pthread_cond_wait(&condition, &zone);  */
        } 
        pthread_mutex_unlock(&zone);
    }
     
    int main(void) {
        struct list *p = init();
        pthread_t td;
    pthread_create(&td, NULL, (void *) push, (void *) p);
        pthread_join(td, NULL);
        return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il me paraît très bizarre, l'appel à pthread_mutex_init() dans la fonction push()...

    Aussi, elle ne fait pas UN empilement, mais un million d'empilements bizarres (normalement, avec une pile simplement chaînée, on insère au début de la liste, pas à la fin).

    En gros, en théorie tu devrais avoir un truc comme ceci, avec le verrou gardé le moins de temps possible:
    Code C : 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
    struct list {
    	int i;
    	struct list *next;
    };
    struct syncStack {
    	struct list *pTop;
    	pthread_mutex_t myLock;
    };
     
    void push(struct syncStack *pStack, int newValue)
    {
    	struct list *newLink = init();
    	newLink->i = newValue;
     
    	pthread_mutex_lock(&pStack->myLock);
    	newLink->i = pStack->pTop;
    	pStack->pTop = newLink;
    	pthread_mutex_unlock(&pStack->myLock);
    }
    int pop(struct syncStack *pStack)
    {
    	struct list *pDel = NULL;
    	int ret;
     
    	pthread_mutex_lock(&pStack->myLock);
    	pDel = pStack->pTop;
    	pStack->pTop = pDel->next;
    	pthread_mutex_unlock(&pStack->myLock);
     
    	ret = pDel->i;
    	free(pDel);
    	return ret;
    }
     
    void* pushMillion(void*pv)
    {
    	struct syncStack *pStack = pv;
    	int i;
    	for(int i=0 ; i<1000000 ; i++)
    		push(pStack, i);
    }
    Ensuite, le reste est brodé autour (threads accédant à la pile, sémaphore sur nombre d'élements de la pile, etc.)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Pthread sur une pile
    Re, merci votre aide, j'ai eu le temps de regarder un peu plus en détail votre code, mais votre implémentation ne prends pas en compte les deux fonctions suivantes: pthread_cond_signal(&condition) et pthread_cond_wait(&condition, &zone). J'ai compilé votre code et le miens et grosso modo les performances sont semblables, en utilisant les les pthreads_cond_* il est normalement possible de diminuer drastiquement la conso cpu, en synchronisant les threads...

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Sauf que pour l'instant, vous n'avez même pas posté ce que chaque thread est censé faire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Sauf que pour l'instant, vous n'avez même pas posté ce que chaque thread est censé faire...
    Si si, la fonction push est supposée employer les fonctions, pthread_cond_signal(&condition) et pthread_cond_wait(&condition, &zone), jettez un oeil sur: http://franckh.developpez.com/tutori...pthreads/#LX-D et vous verrez la conséquence en terme de conso cpu....

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En gros, si j'ai bien compris il faut rajouter une variable pour la taille de la pile, et probablement une condition qu'on attend quand la taille atteint zéro, et qu'on signale quand on rempile quelque chose.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Sur l'utilité d'une allocation sur la pile
    Par deubelte dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2010, 12h41
  2. [Reflection.Emit] Comment charger une référence sur la pile ?
    Par davcha dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 05/06/2008, 14h56
  3. Réponses: 6
    Dernier message: 16/05/2008, 12h25
  4. developpez une pile TCP/IP sur carte ISA
    Par Mercenary Developer dans le forum Réseau
    Réponses: 2
    Dernier message: 13/06/2007, 16h46
  5. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 18h37

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