Partage
  • Partager sur Facebook
  • Partager sur Twitter

threads qui ne fonctionne pas sous linux

mais qui fonctionne parfaitement sous windows

    23 mai 2022 à 11:52:31

    Bonjour, j'ai fait un petit programme en C avec une boucle par thread, le problème c'est que ça ne fonctionne que avec codeblocks sous windows mais pas sous linux:

    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>
    
    using namespace std;
    
    void * HighSpeedFonction(pthread_mutex_t mutex) //fonction thread
    {
        int i=0;
    	pthread_mutex_lock(&mutex);//lock l autre thread
        while(i<5000){
            printf("thread HS %d\n",i);
            i++;
        }
    	pthread_mutex_unlock(&mutex);//libere le mutex
        pthread_exit(NULL);
    }
    
    
    int main() //thread principal
    {
        pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//declaration et initialisation d'un mutex qui permet de mettre en pause un thread temps que l'autre ne unlock pas le mutex
        pthread_t HS; //variable de type pthread_t
        pthread_create(&HS, NULL, HighSpeedFonction, mutex); //fonction qui cree un thread (&variable thread, NULL, pointeur fonction a executer, arg de la fonct)
    
        sleep(10);//laisse le temps a HS de le se lancer en premier
    
    	pthread_mutex_lock(&mutex);
        int i=0;
        while(i<5000){
            printf("thread LS %d\n",i);
    
            i++;
        }
    	pthread_mutex_unlock(&mutex);
        printf("thread main\n");
    
        return 0;
    }

    pour le compiler je fais g++ threads.cpp -o threads -lpthread

    et j'ai les erreurs:

    error: invalid conversion from ‘void* (*)(pthread_mutex_t)’ to ‘void* (*)(void*)’

    error: cannot convert ‘pthread_mutex_t’ to ‘void*’

    qui pointent respectivement sur HighSpeedFonction et mutex à la ligne 26

    pthread_create(&HS, NULL, HighSpeedFonction, mutex);

     quelqu'un à dejà eut ce problème?
    le même programme quand je le lance sous windows avec codeblocks se lance parfaitement.



    -
    Edité par FaroukMakerri1 23 mai 2022 à 11:56:30

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2022 à 12:53:16 - Message modéré pour le motif suivant : Pris en compte par la modération


        23 mai 2022 à 13:08:29

        Bonjour,

        Déplacement vers un forum plus approprié

        Le sujet est déplacé de la section Langage C vers la section Langage C++

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          23 mai 2022 à 13:15:37

          White Crow a écrit:

          Hello,

          fais du C ou du C++ mais pas un mélange des deux …


          normalement c'est du C++, j'ai mis des caractères spécifique au C?
          • Partager sur Facebook
          • Partager sur Twitter
            23 mai 2022 à 13:36:21

            Hello.

            Tu n'as rien mis de propre au C++ dans ton code que tu ne puisses retirer (includes non utilisés). Le message premier dit "C", et effectivement tu n'utilises que des éléments de la bibliothèques standard du C et de la lib POSIX, qui est celle avec laquelle tu as des soucis.

            Et concernant la partie MT de la lib POSIX..., en C++, nous préférerons utiliser maintenant (2011 +) les threads standards -> std::threads. Les mutex se verront encapsulés dans des std::lock_guards qui garantissent le déverrouillage -- on ne veut plus voir de unlock() écrits à la main.

            Autre langage, autre philosophie.

            Bref, je ne sais pas pourquoi le message a été déplacé côté C++. Ou alors si tu compiles vraiment en C++ et que tu soit prêt à une petit remise en question de ton approche, soit le bien venu!

            -
            Edité par lmghs 23 mai 2022 à 13:37:30

            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
              23 mai 2022 à 14:01:41

              lmghs a écrit:

              Hello.

              Tu n'as rien mis de propre au C++ dans ton code que tu ne puisses retirer (includes non utilisés). Le message premier dit "C", et effectivement tu n'utilises que des éléments de la bibliothèques standard du C et de la lib POSIX, qui est celle avec laquelle tu as des soucis.

              Et concernant la partie MT de la lib POSIX..., en C++, nous préférerons utiliser maintenant (2011 +) les threads standards -> std::threads. Les mutex se verront encapsulés dans des std::lock_guards qui garantissent le déverrouillage -- on ne veut plus voir de unlock() écrits à la main.

              Autre langage, autre philosophie.

              Bref, je ne sais pas pourquoi le message a été déplacé côté C++. Ou alors si tu compiles vraiment en C++ et que tu soit prêt à une petit remise en question de ton approche, soit le bien venu!

              -
              Edité par lmghs il y a 17 minutes


              C'est du C++ en effet, visiblement j'ai encore suivi des tutos qui sont dépasser, je viens de tomber sur un cours qui me propose une toute autre façon de procéder et qui utilise ces mêmes threads standards:

              #include <iostream>
              #include <thread>
              
              using namespace std;
              
              void f(int x){
                      cout<<"Un thread C++\n" << x << endl;
              }
              
              int main(){
                      thread t(f,20);
                      t.join();
                      return 0;
              }

              c'est sur la bonne voie?

              j'ai vérifier mon compilateur (mingw gcc) et il utilise bien thread model: posix

              (je suis encore débutant donc j'ai du mal et mes profs de BTS n'ont jamais survolé les threads en 2 ans)

              • Partager sur Facebook
              • Partager sur Twitter
                23 mai 2022 à 16:55:33

                Salut,

                Si tu veux progresser de la bonne manière en C++ "moderne" vas plutôt lire le cours de C++ sur www.zestedesavoir.com il te donnera des bases solides. Evite par contre celui sur ce site, le cours est antédiluvien et tu apprendras des notions dépassées qui font que quand tu commenceras un projet sa maintenabilité sera moindre par exemple (il y a plein d' autres raisons , je vais pas toutes les énumerer).

                -
                Edité par Warren79 23 mai 2022 à 16:56:08

                • Partager sur Facebook
                • Partager sur Twitter

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

                  23 mai 2022 à 19:18:02

                  FaroukMakerri1 a écrit:

                  lmghs a écrit:

                  Hello.

                  Tu n'as rien mis de propre au C++ dans ton code que tu ne puisses retirer (includes non utilisés). Le message premier dit "C", et effectivement tu n'utilises que des éléments de la bibliothèques standard du C et de la lib POSIX, qui est celle avec laquelle tu as des soucis.

                  Et concernant la partie MT de la lib POSIX..., en C++, nous préférerons utiliser maintenant (2011 +) les threads standards -> std::threads. Les mutex se verront encapsulés dans des std::lock_guards qui garantissent le déverrouillage -- on ne veut plus voir de unlock() écrits à la main.

                  Autre langage, autre philosophie.

                  Bref, je ne sais pas pourquoi le message a été déplacé côté C++. Ou alors si tu compiles vraiment en C++ et que tu soit prêt à une petit remise en question de ton approche, soit le bien venu!

                  -
                  Edité par lmghs il y a 17 minutes


                  C'est du C++ en effet, visiblement j'ai encore suivi des tutos qui sont dépasser, je viens de tomber sur un cours qui me propose une toute autre façon de procéder et qui utilise ces mêmes threads standards:

                  #include <iostream>
                  #include <thread>
                  
                  using namespace std;
                  
                  void f(int x){
                          cout<<"Un thread C++\n" << x << endl;
                  }
                  
                  int main(){
                          thread t(f,20);
                          t.join();
                          return 0;
                  }

                  c'est sur la bonne voie?

                  j'ai vérifier mon compilateur (mingw gcc) et il utilise bien thread model: posix

                  (je suis encore débutant donc j'ai du mal et mes profs de BTS n'ont jamais survolé les threads en 2 ans)


                  Oui, c'est ça. On va dire que c'est le Hello World de la programmation concurrente.

                  Tu as un livre qui fait un peu référence: C++ Concurrency in Action, de Anthony Williams. C'est déjà pour des programmeurs avancés.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  threads qui ne fonctionne pas sous linux

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown