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
    Nouveau 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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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
    Nouveau 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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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
    Nouveau 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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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, 11h41
  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, 13h56
  3. R�ponses: 6
    Dernier message: 16/05/2008, 11h25
  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, 15h46
  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, 17h37

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