Synchrone Kanäle

Sonnenblume123

Aktives Mitglied
Hallo,

ich hab diese Aufgabe gegeben und irgendwie komm ich nicht ganz klar.
https://ibb.co/fYUpfp

Wir haben dazu folgende Notation:
• ch <=x: Wert von x wird über den Kanal ch gesendet.
• ch => y: Über Kanal ch empfangene Nachricht wird y zugewiesen.

Meine bisherige Lösung:
Zu Prozess P1:
int n = 0;
loop forever
p1: n = n + 2;
p2: ch[0] <=n;

Zu Prozess P2:
int n = 0;
loop forever
p1: n = n + 5
p2: ch[0] <=n

Zu Prozess P3:
int p1, p2 = 0
loop forever
p1: ch[0] => p1
p2: ch[1] => p2
if(p1 = p2)
print(p1);

Nun fehlen aber noch die Fälle p1<p2 und umgekehrt. Aber es kann ja sein, das p2= 15 und p1= 12 und dann beim nächsten p2=20 und p1 = 14 und das müsste ja dazwischen.
Hoffe auf eure Hilfe:)
 

MoxxiManagarm

Top Contributor
Ich würde jetzt nicht sagen, dass ich es richtig mache. Diese "unigequatsche" verwirrt mich persönlich immer total.
Aber, Prozess 1 sollte in ch[0] schreiben, Prozess 2 in ch[1] und nur dann fortfahren, wenn die entsprechende Position leer ist. Prozess 3 arbeitet immer dann, wenn beide Positionen belegt sind. Und entfernt und verwendet die kleinere. Sind beide gleich, dann entfernt Prozess 3 beide.
 

Sonnenblume123

Aktives Mitglied
Stimmt, hab mich vertippt. Prozess 2 schreibt natürlich in ch[1]. Wie meinst du das genau mit nur dann fortfahren, wenn die entsprechende Position leer ist?
 

MoxxiManagarm

Top Contributor
0 - 0 --> Ausganspunkt, Position ist leer. Prozess 1 und 2 arbeiten
2 - 5 --> Beide Prozess haben gearbeitet, Prozess 3 nimmt die kleinere Zahl (=2) und setzt die 0
0 - 5 --> Prozess 1 arbeitet weil ch[0] = 0 und setzt die 4
4 - 5 --> Prozess 3 nimmt die kleinere Zahl (=4) und setzt die 0
0 - 5 --> Prozess 1 arbeitet weil ch[0] = 0 und setzt die 6
6 - 5 --> Prozess 3 nimmt die kleinere Zahl (=5) und setzt die 0
6 - 0 --> Prozess 2 arbeitet weil ch[1] = 0 und setzt die 10 usw.
6 - 10
0 - 10
8 - 10
0 - 10
10 - 10 --> hier setzt Prozess 3 dann beide Positionen auf 0
0 - 0 --> Prozess 1 und Prozess 2 arbeiten beide weiter
12 - 15



Zumindest verstehe ich die Aufgabe so
 

MoxxiManagarm

Top Contributor
Das würde dann übrigens etwa so aussehen:

Java:
package sc;

public class SynchronChannel {
    public static int[] ch = {0, 0};
   
    public static void main(String[] args) {
        Runnable prozess1 = () ->{
            int n = 0;

            while(true) {
                synchronized(ch) {
                    if(ch[0] == 0) {
                        n += 2;
                        ch[0] = n;
                    }
                }
            }
        };
       
        Runnable prozess2 = () ->{
            int n = 0;

            while(true) {
                synchronized(ch) {
                    if(ch[1] == 0) {
                        n += 5;
                        ch[1] = n;
                    }
                }
            }
        }; 
       
        Runnable prozess3 = () ->{
            while(true) {
                synchronized(ch) {
                    if(ch[0] != 0 && ch[1] != 0) {
                        if(ch[0] < ch[1]) {
                            System.out.println(ch[0]);
                            ch[0] = 0;
                        } else if(ch[0] > ch[1]) {
                            System.out.println(ch[1]);
                            ch[1] = 0;
                        } else {
                            System.out.println(ch[0]);
                            ch[0] = 0;
                            ch[1] = 0;
                        }
                    }
                }
            }
        };
       
        new Thread(prozess1).start();
        new Thread(prozess2).start();
        new Thread(prozess3).start();
    }
}
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben