Thread + C - Page 2

  • Votes
  • Date
  • Date décroissante
  1. Bonjour;
    Bon, a ce moment j'ai utilisé deux thread pour réaliser cette tache, disant j'ai utilisé la sémaphore ( l'un bloc l'autre, après de déblocage l'exécution sera en // ) :)
    Donc maintenant mon problème est ce que je peut utiliser une fonction qui à des variables et que je l'affecte à un thread.

    Exempl :
    Ma_fonction(char *par1, int x)
    { ...... }
    
    if (pthread_create(&filsA, NULL, Ma_fonction, "AA")) {
                    perror("pthread_create");
                    exit(EXIT_FAILURE);
            }
    

    Est ce que je peut utilser sa ou nn?
    Merci d'avance.
    1. Contributeur
      oui et non, il faut que la fonction passer au thread soit de type void*f(void*)
      donc
      void* Ma_fonction(void* A){
      char* par1=(char*)A
      int x=*((int*)((char*)A+1);
      ...
      }
      ensuite, tu crée un pointeur, ou une structure:
      struct A{char* p1;int x;}
      que tu passe en paramètre de pthread_create :
      pthread_create(&filsA, NULL, Ma_fonction, &A)
      1. Re;
        Merci, en fait j'ai créé une autre fonction qui prend pas ds paramétrés. Mais le prb d'affichage "Bonjour Tout le monde" sa existe encore, j'ai pensé que sa marché mais dommage, :( .
        On revient donc a notre première discussion :)

        Autre explication :
        Ma_fonction_thread() {
           injection de données dans le canal Client ( Domaine VoIP)
        }
        
        Ma_fonc_telechar() {
        
           lancer le thread lorsqe la taille du buffer > debut_injection
           et terminer la reception de données ( allocation dans le buffer)
        }
        

        Donc, t'en pense qoi?
        Merci d'avance.
        1. Contributeur
          J'en pense que tu a à ce momnet là un problème de synchronisation.
          1. Re bonjour;
            Les q peut m'aider, j'explique une autre fois le prb, c'est que moi je développe avec C et je voudrai utiliser la notion du thread dans la développement, la question c'est que : comment je peut faire fonctionné mon thread et en même temps ma fonction termine l'exécution du reste du programme. j'explique avec un exemple :
            Mafonction() {
             ...... des instruction 
            
            Appel d thread
            
            Reste des instructions 
            }
            

            Ici je veux que lorsque je fait appel à mon thread, ma fonction "Mafonction" termine l'exécution du reste d code.
            Rq : J'ai créé une variable globale pour faire arrêter mon thread.
            SVP les amis aidez moi.
            1. Contributeur
              un code qui fonctionne :
              #include <stdio.h>
              #include <stdlib.h>
              #include <pthread.h>

              volatile int ok = 0;

              void* affichage (void*) {
              while (ok != 1) { }
              printf(" Tout le monde \n ");
              return NULL;
              }

              int main (void) {
              pthread_t filsA;

              if (pthread_create(&filsA, NULL, affichage, 0)) {
              perror("pthread_create");
              exit(EXIT_FAILURE);
              }

              printf(" \n Bonjour ");
              ok = 1;
              if (pthread_join(filsA, NULL))
              perror("pthread_join");
              return 0;
              }
              1. Re;
                Et tu pense quoi sur ce code ;)

                
                #include <stdlib.h>
                #include <stdio.h>
                #include <pthread.h>
                
                void* maFonctionA()
                {
                    // Affiche 50 fois 1
                        int i = 0;
                        for(i=0 ; i<50 ; i++)
                        printf("1\n");
                }
                void* maFonctionB()
                {
                        // Affiche 50 fois 2
                        int i = 0;
                        for(i=0 ; i<50 ; i++)
                        printf("2\n");
                }
                
                int ff()
                {
                        pthread_t threadA, threadB; // On créun thread
                        int j = 0;
                        pthread_create (&threadA, NULL, maFonctionA, NULL); // Permet d'exéter le fonction maFonction en parallè
                        pthread_create (&threadB, NULL, maFonctionB, NULL);
                        // Attend la fin tu thread cré
                        pthread_join(threadA, NULL);
                        pthread_join(threadB, NULL);
                        return 0;
                }
                
                int main() {
                
                        int x = ff();
                        return x;
                }
                
                


                Le résultat donné est le suivant :

                Code : Console
                1111111111222222222222222222222222222222222111111111111111111111111111111111112222222222222222211111

                Mais pourquoi les nombres s'affichent par paquets ? Si les fonctions se lançaient en parallèle, je devrais obtenir 12121212...

                Si les nombres s'affichent par paquet, c'est à cause de votre OS.
                En effet, la fonction principale (main) et la fonction exécuté par le thread créé (maFonction) ne se lance pas tout à fait en parallèle car votre OS va attribuer un temps d'exécution pour chaque thread.
                Votre OS va, par exemple, exécuter le code du thread n°1 de votre processus pendant 8 ms, puis va exécuter le code du thread n°2 du même processus aussi pendant 8 ms, etc. ...
                Il en est de même pour le fonctionnement des processus ;) .
                Ainsi, comme chaque thread est exécuté à tour de rôle pendant un temps très court, vous avez l'impression qu'ils se déroulent en parallèle.
                Précédent
                • 1
                • 2