next up previous contents index
Next: Lösung in FORTRAN Up: 3.3 Erzeugung und Beendigung Previous: Lösung in C++

Lösung in Modula-2

Das Modula-2 Programm  ist wie folgt. Wie im C++ Programm werden die Variablen u, v, w, x global deklariert. Ebenso werden die Statements x := u + v + w, u := 3, v := 4 und w := 5 in den Funktionen P1, P2, P3, P4 abgearbeitet. Im Hauptprogramm tuwas werden dann die Pthread Variablen mit VAR t1, t2, t3, t4: pthread_t; deklariert und mit pthread_create wird dann die Ausführung der 4 Funktionen angestoßen. Anschliessend wird mit pthread_join auf die Beendigung der 4 Funktionen gewartet und danach werden die Werte der Varaiblen mit WriteLong angezeigt.

       MODULE ppauf3;

       FROM SYSTEM IMPORT ADDRESS; 
          
       FROM pthread IMPORT pthread_t, attr_default, 
                           pthread_create, pthread_join;
          
       FROM StdIO IMPORT WriteS, WriteLong, WriteNl, WriteFlush;  
     
          VAR u, v, w, x: INTEGER; 
          
          PROCEDURE P1(VAR arg: ADDRESS): ADDRESS; 
          (* statement 1. *)
          BEGIN 
          (*1*) x:=u+v+w; 
                RETURN( arg )
          (*9*) END P1;
          
          PROCEDURE P2(VAR arg: ADDRESS): ADDRESS; 
          (* statement 2. *)
          BEGIN 
          (*1*) u:=3; 
                RETURN( arg )
          (*9*) END P2;
          
          PROCEDURE P3(VAR arg: ADDRESS): ADDRESS; 
          (* statement 3. *)
          BEGIN 
          (*1*) v:=4; 
                RETURN( arg )
          (*9*) END P3;
          
          PROCEDURE P4(VAR arg: ADDRESS): ADDRESS; 
          (* statement 4. *)
          BEGIN 
          (*1*) w:=5; 
                RETURN( arg )
          (*9*) END P4;
          
          PROCEDURE tuwas;
          (* wie der name schon sagt. *)
          VAR   t1, t2, t3, t4: pthread_t;
                i1, i2, i3, i4: INTEGER; 
                o1, o2, o3, o4: INTEGER; 
          BEGIN
          (*1*) (*initialize*) i1:=1; i2:=2; i3:=3; i4:=4; 
                u:=0; v:=1; w:=2; 
          (*2*) (*start procedures *) 
                IF pthread_create(t1,attr_default,P1,i1) < 0 THEN END;  
                IF pthread_create(t2,attr_default,P2,i2) < 0 THEN END;  
                IF pthread_create(t3,attr_default,P3,i3) < 0 THEN END;  
                IF pthread_create(t4,attr_default,P4,i4) < 0 THEN END;  
          (*3*) (*collect procedures *)
                IF pthread_join(t1,o1) < 0 THEN (*...*) END;  
                IF pthread_join(t2,o2) < 0 THEN END;  
                IF pthread_join(t3,o3) < 0 THEN END;  
                IF pthread_join(t4,o4) < 0 THEN END;  
          (*4*) (*finalize*)
                WriteS(" u = "); WriteLong(u,0); 
                WriteS(" v = "); WriteLong(v,0); 
                WriteS(" w = "); WriteLong(w,0); 
                WriteS(" x = "); WriteLong(x,0); 
                WriteNl; WriteFlush; 
          (*9*) END tuwas;
          
          VAR i: INTEGER; 
          
          BEGIN 
                FOR i:=1 TO 10 DO tuwas; END; 
          END ppauf3.

Das Programm wird mit

             >make ppauf3 
                   :mtc ppauf3.mi 
                   :cc ppauf3.c -para
compiliert und mit
             >ppauf3
ausgeführt. Das zugehörige Makefile befindet sich im Anhang. Die Ausgabe könnte etwa wie folgt aussehen. Die Ausgabe x = 3, in der ersten Zeile, zeigt, daß die Summe u + v + w vor den Zuweisungen an die Variablen berechnet wurde. Die Ausgabe x = 9, in der zweiten Zeile, zeigt, daß zu erst die Zuweisungen an v und w ausgeführt wurden, dann die Summe u + v + w berechnet wurde und schliesslich die Zuweisung an u ausgeführt wurde. Die Ausgabe x = 6, in der dritten Zeile, zeigt, daß zu erst die Zuweisung an u ausgeführt wurde und dann die Summe u + v + w berechnet wurde. Anschließed wurden die Zuweisungen an v und w ausgeführt.

             u = 3 v = 4 w = 5 x = 3
             u = 3 v = 4 w = 5 x = 9
             u = 3 v = 4 w = 5 x = 6
             u = 3 v = 4 w = 5 x = 3
             u = 3 v = 4 w = 5 x = 3
             u = 3 v = 4 w = 5 x = 3
             u = 3 v = 4 w = 5 x = 3
             u = 3 v = 4 w = 5 x = 3
             u = 3 v = 4 w = 5 x = 3
             u = 3 v = 4 w = 5 x = 3



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