-
Berechnung von Pi mit der "Montecarlo-Methode"
Bestimme N gleichverteilte Zufallszahlen im Quadrat [0,1] x [0,1];
NT sei die Anzahl von Zufallspunkten im Viertelkreis.
Dann ist
-
Sourcen:
pi.c |
Das Beispielprogramm |
rand.h |
Header für Random-Generator |
rand.c |
Implementation des Random-Generators |
-
Aufbau des Programms:
Master-Thread:
-
Anzahl von Würfen pro Slave berechnen
-
Slaves starten, die alle die Routine calc ausführen
-
auf Beendigung der Slaves warten
-
zurückgegebene Werte sammeln
-
Gesamtergebnis berechnen und ausgeben
Slave-Threads:
-
Teil-Ergebnisse berechnen und Ergebnis zurückgeben
-
Pthread-Funktionen:
#include <pthread.h>
-
alle Definitionen von Typen, Funktionen etc. einbinden
int pthread_create(pthread_t *thread_id,
const pthread_attr_t *attr,
void * (*func)(void *), void *arg);
-
erzeugt einen neuen Thread, der func(arg) ausführt,
gibt 0 oder Fehlercode zurück
-
thread_id:
eindeutige Kennzeichnung des neuen Threads
muß kein Integer sein, insbesondere nicht durchnumeriert
Vorstellung: asymmetrische Threads, total dynamisch
-
attr:
bezeichnet spezielle Eigenschaften des neuen Threads
(z.B. Stackgröße oder Priorität)
normalerweise einfach NULL
-
void * func(void *)
Funktion, die vom neuen Thread ausgeführt wird
gibt ggf. Ergebnis als void * zurück
-
arg: Argument von func, im einfachsten Fall NULL
int pthread_join(pthread_t thread_id, void **status);
-
wartet auf Beendigung des angegebenen Threads
-
kommt sofort zurück, falls Thread schon fertig
-
empfängt dessen Ergebnis in status
-
Bemerkungen:
Anzahl Threads hier fest, Alternativen etwa:
-
Kommandozeilen-Parameter
-
Abfrage nach Zahl der CPUs (nicht portabel, ggf. nicht vorhanden!)
Keine explizite Kommunikation nötig,
Austauch einfach über
-
globale Variable (mytotal)
-
Argument bzw. Returnwert der Threadfunktion (myhits_p)
Vorsicht:
Rückgabewert darf keine lokale Variable in calc sein !
Standard-Funktion rand funktioniert nicht mit mehreren Threads
(s.u.)
Haarsträubend: Initialisierung von seed über dubiosen Cast
Besser: jeder Thread bekommt eine eindeutige Nummer
(s.u.)