GNU/Linux & C & Threads > wie geht das? (kein fork())
-
Hallo,
ich habe eine rechenintensive anwendung die mehrere dinge parallel (oder so in der richtung) bearbeitet. Da ich leider nur 500 Mhz (und davon 4 Stück a 1 MB) habe würde ich gerne diese berechnungen mit threads jeden prozessor auslasten, sodass ich von den 4 Cpu's wirklich was merke...
aus einem buch weiss ich es gibt fork's, diese möchte ich aber nicht da diese mehr speicher benötigen und IPC usw. vorraussetzen.
soweit ich weiss gibst das auch in C, jedoch finde ich nichts
PS: Mein Prog läuft auf Linux. > SL 10.2 @ (i)386
Danke für eure Threads
-
Dieser Thread wurde von Moderator/in TactX aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
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); }