Annonce

Réduire
Aucune annonce.

[ Thread ]

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • [ Thread ]

    Bonjour,

    Une questions à propos du code ci-dessous :

    Code:
    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    struct params {
            pthread_mutex_t mutex;
            pthread_cond_t done;
            int id;
    };
    
    typedef struct params params_t;
    
    void* hello(void* arg){
    
        int id;
        /* Lock.  */
        pthread_mutex_lock(&(*(params_t*)(arg)).mutex);
    
        /* Work.  */
        id = (*(params_t*)(arg)).id;
        printf("Hello from %d\n", id);
    
        /* Unlock and signal completion.  */
        pthread_mutex_unlock(&(*(params_t*)(arg)).mutex);
        pthread_cond_signal (&(*(params_t*)(arg)).done);
    
        /* After signalling `main`, the thread could actually
        go on to do more work in parallel.  */
    }
    
    
    int main() {
    
        pthread_t threads[10];
        params_t params;
        pthread_mutex_init (&params.mutex , NULL);
        pthread_cond_init (&params.done, NULL);
    
        /* Obtain a lock on the parameter.  */
        pthread_mutex_lock (&params.mutex);
    
        int i;
        for(i = 0; i < 10; i++) {
    
                /* Change the parameter (I own it).  */    
                params.id = i;
    
                /* Spawn a thread.  */
                pthread_create(&threads[i], NULL, hello, &params);
    
                /* Give up the lock, wait till thread is 'done',
                then reacquire the lock.  */
                pthread_cond_wait (&params.done, &params.mutex);
        }
    
        for(i = 0; i < 10; i++) {
                pthread_join(threads[i], NULL);
        }
    
        /* Destroy all synchronization primitives.  */    
        pthread_mutex_destroy (&params.mutex);
        pthread_cond_destroy (&params.done);
    
        return 0;
    }
    Le code n'est pas très compliqué, on cherche juste à incrémenter une variable dans des thread différents.

    1 - Sachant que la boucle qui crée les thread est synchronisée avec la fin du thread créer précédemment, on aura toujours qu'un seul thread en exécution, et non pas les 10 en même temps ?

    Code:
    or(i = 0; i < 10; i++) {
    
                /* Change the parameter (I own it).  */    
                params.id = i;
    
                /* Spawn a thread.  */
                pthread_create(&threads[i], NULL, hello, &params);
    
                /* Give up the lock, wait till thread is 'done',
                then reacquire the lock.  */
                pthread_cond_wait (&params.done, &params.mutex);
        }
    2 - La boucle de mise en attente de la fin des thread dans la fonction main semble inutile car nous avons déjà la fonction pthread_cond_wait() qui verrouille son exécution ?

    Code:
     for(i = 0; i < 10; i++) {
                pthread_join(threads[i], NULL);
        }
    Aucuns intérêts d'utiliser des thread donc, j'ai compilé le programme sans la boucle pthread_join ci-dessus, j'ai bien ma suite de 0-9 dans l'ordre.

    Cordialement,

    Shirocen.
    deux et deux font cinq

  • #2
    Salut

    Envoyé par shirocen Voir le message
    Le code n'est pas très compliqué, on cherche juste à incrémenter une variable dans des thread différents.
    Sauf si je me trompe, en mon avis, en plus chaque thread éxécute la fonction d'affichage (printf) et affiche Hello from plus son numéro d'identification (params.id).
    Je ne comprend pas pourquoi dans la fonction main, tu mets ce bloc de code ci-dessous en section critique :
    Code:
        int i;
        for(i = 0; i < 10; i++) {
    
                /* Change the parameter (I own it).  */    
                params.id = i;
    
                /* Spawn a thread.  */
                pthread_create(&threads[i], NULL, hello, &params);
    
                /* Give up the lock, wait till thread is 'done',
                then reacquire the lock.  */
                pthread_cond_wait (&params.done, &params.mutex);
        }
    
        for(i = 0; i < 10; i++) {
                pthread_join(threads[i], NULL);
        }
    Sauf si je me trompe, c'est plus intéressant de mettre un code exécuté par un thread en section critique pour éviter que les autres threads viennent enpiéter sur le traitement. Apparemment c'est le thread principal (via main) qui est seul. STP Je souhaiterais une explication.

    A mon avis, sauf si je me trompe avec pthread_join(threads[i], NULL); le thread principal attend que tous les autres threads aient terminés leur exécutioin avant de continuer par la suite avec les autres instructions. Apparemment tu as géré cela en mettant l'exécution de chaque thread en section critique, en plus la fonction pthread_cond_wait (&params.done, &params.mutex); déverouille le mutex et attend que la variable condition soit signalée. Dès qu'elle est signalée le thread principal verouille encore le mutex et attend un prochain signal sur la variable condition.
    La variable condition spécialement relative au facteur de la boucle for -> (i = 0; i < 10; i++)
    Bon face à cela, as-tu observé la complexité en temps de ton code?

    STP je souhaiterais certaines explications citées ci-dessus.
    MERCI
    Dernière modification par rodrigue daniel, 01 mai 2016, 20h24.
    Passionné par la Sécurité Informatique.
    Le véritable ennemi de la connaissance n'est pas l'ignorance mais l'illusion de la connaissance.
    La quête de la connaissance passe d'abord par l'humilité et ensuite la détermination.

    Commentaire


    • #3
      Salut,

      Ce code n'est pas le mien !

      J'ai l'ai trouvé sur stackoverflow alors que je cherchais des réponses sur les threads justement.

      Je suis tout à fait d'accord avec toi, à savoir que le temps d’exécution et bien trop long et que l'utilisation des thread, bon même si c'était pour un exemple, n'est pas du tout judicieuse.

      De même que le mutex qui ne sert à rien parce-qu'on aura au maximum un seul thread sur la variable..

      Bref', c'est un bon code pour comprendre le fonctionnement, mais pas du tout cohérent.

      Cordialement,

      Shirocen.
      deux et deux font cinq

      Commentaire

      Chargement...
      X