Partage
  • Partager sur Facebook
  • Partager sur Twitter

déclencher 2 thread en même temps

    23 mai 2017 à 15:46:17

    Bonjour,

    Je souhaite faire 2 thread qui s'éxécute au même moment pour ne pas perdre de temps de mon execution, j'ai donc utiliser les mutex et les cond_wait et cond_broadcast mais à l'execution les deux threads ne sont pas executée en même temps...

    Voici mon code :

    #include <pthread.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <stdint.h>
    #include <stdlib.h>
    
    
    
    pthread_cond_t condition = PTHREAD_COND_INITIALIZER;
    
    void *Fonction1();
    void *Fonction2();
    
    int main(void)
    {
    	printf("Avant création des threads\n");
    	pthread_t threadF1, threadF2;
    
    	pthread_create(&threadF1, NULL, Fonction1, NULL);
    	pthread_create(&threadF2, NULL, Fonction2, NULL);
    
    	printf("Après création des threads\n");
    
    	while(1)
    	{
    		printf("Avant libération\n");
    		pthread_cond_broadcast(&condition);
    		printf("Après libération\n");
    		sleep(5);
    	}
    
    	return 1;
    }
    
    void *Fonction1()
    {	
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    
    	while(1)
    	{
    		pthread_mutex_lock(&mutex);
    		pthread_cond_wait(&condition, &mutex);
    		printf("Je suis le thread 1...\n");
    		pthread_mutex_unlock(&mutex);
    	}
    }
    
    void *Fonction2()
    {
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    	while(1)
    	{
    		pthread_mutex_lock(&mutex);
    		pthread_cond_wait(&condition, &mutex);
    		printf("Je suis le thread 2...\n");
    		pthread_mutex_unlock(&mutex);
    	}
    }
    

    Comment faire en sorte pour que à la libération de la condition, les 2 threads s'executent en même temps ?

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2017 à 15:55:59

      Salut,

      Ce que je vois dans ton code, c'est que tu crées 2 mutex (un dans chaque thread)

      Non, c'est dans le main qu'il faut créer un mutex, et le passer en paramètre à chaque thread.

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        23 mai 2017 à 16:02:33

        Fvirtman a écrit:

        Salut,

        Ce que je vois dans ton code, c'est que tu crées 2 mutex (un dans chaque thread)

        Non, c'est dans le main qu'il faut créer un mutex, et le passer en paramètre à chaque thread.


        Et si je le mets en variable globale ? Parce que je viens de tester et je n'ai toujours pas la synchro...

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2017 à 16:03:54

          Variable globale ou, ça marcheraiti (mais c'est dégueulasse) : il faut qu'il y ait UN mutex.

          Après qu'appelles tu synchro exactement ? Car l'un dans l'autre tu auras toujours un thread qui commencera d'écrire, et l'autre après hein :)

          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            23 mai 2017 à 16:09:11

            J'entends par synchro que les 2 threads se lancent en même temps à l'activation de la condition

            Et pourquoi avec 2 mutex séparés ça ne fonctionne pas ? Je cherche à comprendre :)

            EDIT : Et tu me dis qu'il faudrait que je passe mes mutex en paramètre pour être moins barbare, il faut que je les caste en void * ? Et si je veux pousser le vice encore plus loin..Est ce qu'il est possible également de passer ma cond en paramètre ?

            -
            Edité par naudar71 23 mai 2017 à 16:18:41

            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2017 à 16:40:45

              Tu peux passer ce que tu veux en paramètre : tu fais une structure, tu mets tout ce que tu veux dedans, et tu passes son adresse est paramètre.

              Un mutex, c'est comme le verrou d'une porte de toilettes : tu le fermes, l'autre qui arrive le voit fermé et attend. Et tu le déverouilles en sortant.

              Si tu fais 2 mutex, tu fais 2 verrous, si chacun a son verrou, tu ne vois pas si quelqu'un d'autre a verrouillé !

              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                23 mai 2017 à 18:39:31

                Bonjour

                Il faut aussi prendre en compte le deadlock : si chaque thread à vérouillé un mutex et qu'il attend que l'autre soit dévérouillé...

                Vous n'avez pas évoqué ce problème il me semble.:)

                • Partager sur Facebook
                • Partager sur Twitter

                Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

                déclencher 2 thread en même temps

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown