GNU/Linux & C & Threads > wie geht das? (kein fork())



  • mit pthread kannst Du Threads erstellen, siehe hier



  • Hier ein Beispielprogramm aus meinem Buch "C und Linux":

    /*
        pthread.c - Kind-Prozess mit der libpthread
    */
    
    # include <stdio.h>
    # include <string.h>
    # include <pthread.h>
    
    static char buffer[80] = "Can you hear me?";
    
    void *child_function(void *text)
     {
      static int status;
    
      printf("child is running.\n");
      strcat(buffer, text);
      status = 0;
      pthread_exit(&status);
     }
    
    int main()
     {
      int *status_ptr;
      pthread_t child_thread;
    
      printf("buffer='%s'\n", buffer);
    
      printf("running child...\n");
      if (pthread_create(&child_thread, NULL, &child_function, " Yes!"))
       {
        fprintf(stderr, "pthread: pthread_create() failed.\n");
        return(1);
       }
    
      if (pthread_join(child_thread, (void *)&status_ptr))
        fprintf(stderr, "pthread: pthread_join() failed.\n");
      else
        printf("child returned %d.\n", *status_ptr);
    
      printf("buffer='%s'\n", buffer);
    
      return(0);
     }
    


  • Vielen Dank! werd ich gleich mal testen.

    MfG



  • Damit das ganze funktioniert muss man bei gcc noch -lpthread oder -pthread
    ranhängen.



  • hallo weiss einer ob threads im taskmanager zu sehen sind, da das bei dem apache ja auch so ist?

    Hab mal versucht ein endlos Programm daraus zu machen welches 2 Threads ausführen soll, damit ich evt. die Threadprozesse sehen kann und endlich mal zumindest 2 CPU's ausgelastet sind...Das eine soll dauernd 'C1' und das andere 'C2' ausgeben. Leider beendet es sich einfach. Hat jemand eine Idee?

    Compiliert mit: gcc -O2 -g0 -static -pthread

    # include <stdio.h> 
     # include <string.h> 
     # include <pthread.h> 
    
     void *child_function(void *text) 
      { 
    	int some;
    for(;;)
    {
    	some=4564646*1891899;
    	printf("C1");
    }
      } 
    
     void *child_function2(void *text) 
      { 
    	int some;
    for(;;)
    {
    	some=4564646*1891899;
    	printf("C2");
    }
      } 
    
     int main() 
      { 
       int *status_ptr; 
       pthread_t child_thread, child_thread2; 
    
    	pthread_create(&child_thread, NULL, &child_function, " Yes!");
    	pthread_create(&child_thread2, NULL, &child_function2, " Yes!");
    
       return(0); 
      }
    

    Danke!



  • Zur ersten Frage: nein - Threads tauchen nicht in der Prozessliste auf

    Zur zweiten Frage: ein Programm ist zu Ende, wenn die main-Funktion fertig ist. Wenn Du einfach 2 Threads startest und dann aus der main-Funktion beendest, beendet sich das Programm und alle Threads werden beendet. Schau Dir mal pthread_join an.

    Tntnet



  • Hallo, vielen Dank, vielleicht ist es doch nicht das was ich suche. Ist es nicht richtig das ein Thread unabhängig von dem Prozess der auf z.B. CPU0 läuft auch einen anderen Prozessor z.B. CPU1 belasten kann?

    Wenn ja wie wirkt es sich auf die Prozessliste aus z.B. 'Befehl: top' steht dann bei dem Prozess 200% Auslastung?

    vielleicht brauche ich ja doch fork(), > bildet doch neue Prozesse die so auch von anderen CPU's übernommen werden kann.

    Danke!



  • cens schrieb:

    Hallo, vielen Dank, vielleicht ist es doch nicht das was ich suche. Ist es nicht richtig das ein Thread unabhängig von dem Prozess der auf z.B. CPU0 läuft auch einen anderen Prozessor z.B. CPU1 belasten kann?

    klar. Der Scheduler teilt die eben auf freie Ressourcen auf. Das kann sein, das davon ein Thread auf CPU0 und der andere auf CPU1 läuft



  • Threads werden auf die CPUs verteilt. Je nach Version von top siehst du auch mal 200% in der Auslastung.

    Du kannst durch drücken der Taste "1" die Auslastung nach CPU erhalten. Das Programm ps kann dir auch die Liste nach Threads aufschlüsseln Option H.



  • Ponto schrieb:

    Threads werden auf die CPUs verteilt. Je nach Version von top siehst du auch mal 200% in der Auslastung.

    Du kannst durch drücken der Taste "1" die Auslastung nach CPU erhalten. Das Programm ps kann dir auch die Liste nach Threads aufschlüsseln Option H.

    Vielen Dank, genau das wollte ich wissen!



  • Wie lange habe ich darauf gewartet?...

    Cooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooool 390% Prozessorauslaustung!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > 2 Ghz!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 🙂 🙂

    Eine Frage noch wie kann ich mit den funktionen daten austauschen, mache ich das am besten über globale Variablen oder wie?

    Und noch eine (😕) für was ist denn eigentlich

    static int
    

    nützlich?

    MfG & Vielen Vielen DANK! 👍

    Achso hier der Code:

    /* 
         pthread.c - Kind-Prozess mit der libpthread 
     */ 
    
     # include <stdio.h> 
     # include <string.h> 
     # include <pthread.h> 
    
     static char buffer[80] = "Can you hear me?"; 
    
     void *child_function(void *text) 
      { 
       static int status; 
    
       printf("child is running.\n"); 
       strcat(buffer, text); 
       status = 0; 
    	for(;;) printf("");
       pthread_exit(&status); 
      } 
     void *child_function2(void *text) 
      { 
       static int status; 
    
       printf("child is running.\n"); 
       strcat(buffer, text); 
       status = 0; 
    	for(;;) printf("");
       pthread_exit(&status); 
      } 
    
     void *child_function3(void *text) 
      { 
       static int status; 
    
       printf("child is running.\n"); 
       strcat(buffer, text); 
       status = 0; 
    	for(;;) printf("");
       pthread_exit(&status); 
      } 
    
     void *child_function4(void *text) 
      { 
       static int status; 
    
       printf("child is running.\n"); 
       strcat(buffer, text); 
       status = 0; 
    	for(;;) printf("");
       pthread_exit(&status); 
      } 
    
     int main() 
      { 
       int *status_ptr; 
       pthread_t child_thread, child_thread2, child_thread3, child_thread4; 
    
       printf("buffer='%s'\n", buffer); 
    
       printf("running child...\n"); 
    
    	pthread_create(&child_thread2, NULL, &child_function2, " Yes!");
    	pthread_create(&child_thread3, NULL, &child_function2, " Yes!");
    	pthread_create(&child_thread4, NULL, &child_function2, " Yes!");
    
       if (pthread_create(&child_thread, NULL, &child_function, " Yes!")) 
        { 
         fprintf(stderr, "pthread: pthread_create() failed.\n"); 
         return(1); 
        } 
    
       if (pthread_join(child_thread, (void *)&status_ptr)) 
         fprintf(stderr, "pthread: pthread_join() failed.\n"); 
       else 
         printf("child returned %d.\n", *status_ptr); 
    
       printf("buffer='%s'\n", buffer); 
    
       return(0); 
      }
    

Anmelden zum Antworten