[C] Pthreads

Charlie85

Newbie
Registriert
Mai 2013
Beiträge
5
ein schönen guten Tag ich habe mich auf pthreads gestürzt und habe mal so ein kleines Programmchen geschrieben um die Performance unterschied zwischen singlethread Programm und multithread Programm zu sehen .
Seltsamer weise kriege ich höhere Zeiten beim Multithreading woran kann dass liegen ?
ich poste mal den code
Code:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
/* 100000 Elemente */
#define MAX 50000
#define MIN 50000
#include <time.h>
/* ein Array von großen zu kleinen Werten */
int test_array1[MAX];
int test_array2[MIN];




/* in umgekehrter Reihenfolge erstellen */

// Thread 1
static void *bubble1(void* val) {
   static int in, elem=MAX;

   printf("Thread bubble1() wurde gestartet\n");

   while(elem--)
      for(in = 1; in <= elem; in++);




   printf("Thread bubble1() wurde beendet\n");
   // Der Rückgabewert interessiert uns nicht.
   printf("durch");
   return NULL;
}


// Thread 2
static void *bubble2(void* val) {
   static int i, elemente=MIN;

   printf("Thread bubble2() wurde gestartet\n");

   while(elemente--)
      for(i = 1; i <= elemente; i++);


   printf("Thread bubble2() wurde beendet\n");
   // Der Rückgabewert interessiert uns nicht.


   return NULL;
}


int main (void) {




    

    printf("Haupt-Thread main() wurde gestartet\n");
 

int z ;
printf("\nProgramm ohne Threads also Singlecore 0 Eingabe sonst willkürlich \n");
scanf("%d",&z);
int start, ende;

start=clock();
if(z==0){

   bubble1(NULL);
bubble2(NULL);

}else{
    // Thread 1 erzeugen

    pthread_create( &thread1, NULL, bubble1, NULL );

    // Thread 2 erzeugen


    pthread_create( &thread2, NULL, bubble2, NULL );


    // Main-Thread wartet auf beide Threads.
    
    pthread_join( thread1, NULL );
    pthread_join( thread2, NULL );
}


  ende=clock();
printf("gemessene Zeit =%.3f  ",(float)(ende-start)/CLOCKS_PER_SEC);

    printf("\nHaupt-Thread main() wurde beendet\n");

return 0;
    }
 
Zuletzt bearbeitet:
Nabend,
Soll dein Programm in den while und for Schleifen irgendetwas machen und hast du das bei deinem Post rausgenommen?

Falls da tatsächlich nichts passiert würde ich sagen, der Compiler optimiert das weg und du hast nur noch die printf's dastehen.
Das hat dann zur Folge, dass das Anlegen, Starten und Aufräumen der Threads mehr Zeit in Anspruch nimmt als wenn du die beiden Funktionen einfach sequentiell ausführst.


MfG
 
ich hatte vorher sowas stehen analog bubble1 aber trotzdem kam ich auf diese schlechte zeit vom Multi Threading

Code:
static void *bubble2(void* val) {
   static int i, elemente=MIN;
 
   printf("Thread bubble2() wurde gestartet\n");
 
   while(elemente--)
      for(i = 1; i <= elemente; i++)
      test_array2[i]=i;
 
 
   printf("Thread bubble2() wurde beendet\n");
   // Der Rückgabewert interessiert uns nicht.
 
 
   return NULL;
}
 
Multithreading ist nicht per Definition schneller :)

Es ist tatsächlich gut möglich, dass der Compiler die Schleife wegoptimiert. Da du pthreads verwendest, gehe ich auch mal davon aus, dass du auch den gcc benutzt. Optimierungen kannst du dort zu Testzwecken per "-O0" deaktivieren. Alternativ sollte in den Schleifen irgendeine Berechnung stehen, deren Resultat verwendet wird (Aufsummieren eines Feldes und Ausgabe der Summe z.B.).
Weiterhin wäre die Frage, wie du die Zeit misst bzw. bestimmst?
Was für ein Prozessor ist den im Einsatz? Und welche Zeiten hast du denn gemessen?

Übrigens werden für das Beispiel nicht unbedingt zwei getrennte Funktionen benötigt. Wenn du das "static" von den lokalen Variablen entfernst, können beide Threads die gleiche Funktion gleichzeitig ohne Probleme bearbeiten.
 
Zuletzt bearbeitet:
ich messe die mit dem clock() vom time.h um eine ungefähre laufzeit zu haben . Ich habe ein AMD Turion(tm) 64 X2 Mobile Technology TL-64 . ich habden code jetzt so geändert dass ich jetzt zwei zahlen multipliziere (natürlich verschieden Zahlen ) und in diese array felder reinschreibe meine Mess zeiten sind ohne Threads 12.61 sec und mit threads 38.78 sec
ich beobachte auch die Leistung der beiden CPUs und bei der mit Thread variante sind beide 100% ausgelastet
 
Zuletzt bearbeitet:
Zurück
Oben