next up previous contents index
Next: Lösung in C++ Up: 3 POSIX threads Previous: 3.2.1 Header Dateien und

3.3 Erzeugung und Beendigung von Pthreads

Im folgenden wollen wir das

con tex2html_wrap_inline2217 end
Sprachkonstrukt implementieren.  Zur Verfügung stehen uns die Pthread-Funktionen create  und join  mit den folgenden Spezifikationen:
int pthread_create (pthread_t      *thread,
                    pthread_attr_t  attr,
	            pthread_func    start_routine,
                    void           *arg);
Erzeugen eines neuen Pthreads.

int pthread_join (pthread_t   thread,
                  void      **status);
Warten auf die Beendigung des angegebenen Pthreads.
  

Die Datentypen pthread_t und pthread_attr_t sowie die Funktionen werden im pthread.h Header-File deklariert. Die start-routine muß eine einparametrige Funktion sein:

       typedef void *(*pthread_func)(void *)
    Als Attribut kann man ein default-Attribut  verwenden, das ebenfalls in pthread.h deklariert wird.
       pthread_attr_t pthread_attr_default
und schon initialisiert ist. Nur falls man spezielle Eigenschaften der Pthreads haben möchte, muß man sich diese Attribute mit den entsprechenden Funktionen selbst erzeugen.

pthread_create nimmt als Eingabe ein Attribut attr, eine Prozedur start_routine und einen Pointer auf einen Parameter arg, der der start_routine beim Aufruf übergeben wird. pthread_create hat als Ausgabe einen Pthread Identifikator thread, (der z.B. in join wieder gebraucht wird) und einen Error code als Funktionswert vom Typ int (=32 bit int).  

pthread_join nimmt als Eingabe den entsprechenden Pthread Identifikator thread und liefert in status den Funktionswert der start_routine zurück. Der Funktionswert von pthread_join ist wieder ein Error code.  

Falls die Aufrufe erfolgreich sind, wird als Error code 0 zurückgegeben, sonst ein Wert < 0.

Die Semantik von

          e= pthread_create (&t, a, f, &x);
          e= pthread_join (t, &y);
ist somit gleich der Semantik von
          y= f(x);
falls f keine globalen Variablen verwendet oder nur dieser eine Pthread erzeugt wird.

Zur Implementierung des con Sprachkonstruktes müssen wir nur noch die Statements tex2html_wrap_inline2076 (Si) in Prozeduren Pi packen.

       void *Pi (void *i)
       { Si; RETURN NULL; };

Damit ist con tex2html_wrap_inline2217 end tex2html_wrap_inline2396

       e=pthread_create (&t1, a, P1, &x);
       ...
       e=pthread_create (&tn, a, Pn, &x);

       e=pthread_join (t1, y);
       ...
       e=pthread_join (tn, &y);
Wobei t1, ..., tn als Variablen vom Typ pthread_t deklariert werden müssen und x und y vom Typ (void *).  

aufgabe597

Wir geben im folgenden ausfürlich eine Lösung in C++, in Modula-2 und in FORTRAN an. Bei den weiteren Aufgaben werden wir uns allerdings wieder nur auf die Diskussion der Lösungen in einer Programmiersprache beschränken.




next up previous contents index
Next: Lösung in C++ Up: 3 POSIX threads Previous: 3.2.1 Header Dateien und

parallel@rz.uni-mannheim.de
Mon Okt 28 14:38:25 PST 1996