Hallo zusammen,
ich habe folgenden Pseudocode erhalten: (Es soll beantwortet werden ob eine Race Condition eintritt und wo)
Nun kann hierbei eine Race Condition auftreten, action ist global Definiert. Somit existiert nur ein Objekt für die Lichtschranke und die Türsteuerung. Das Datenelement wird sowohl geschrieben als auch gelesen, das würde schon eine Synchronisation nötig machen. Die Race Condition tritt hier jedoch bei beiden in der while Schleife ein. Die Lichtschranke schreibt action und zur gleichen Zeit kann es passieren das die Türsteuerung in der if Abfrage action lesen möchte. Wenn nun die Lichtschranke zu erst dran kommt und zwischenzeitlich bevor zu ende geschrieben werden konnte ein Threadwechsel passiert liest die Tür einen Falschen wert.
Das wäre erst einmal meine Antwort.
Nun geht es aber weiter und da komme ich nicht ganz mit.
Wenn ich das jetzt korrekt verstehe ist der Semaphore nicht Global Definiert. Somit hätte jede Klasse (Objekt) dann seinen eigenen Semaphore. Dann bringt diese ändern überhaupt nichts oder Der Semaphore würde bei s.p() runtergezählt werden, der Kritische Abschnitt betretten werden und einfach wieder verlassen werden über s.v();. Davon bekommt das jeweils andere Objekt nichts mit. Die Race Condition wäre damit nicht beseitigt.
Über sehe ich hierbei etwas? Birgt diese Semaphore Implementierung noch irgendwelche Nebeneffekte (Fehler)?
ich habe folgenden Pseudocode erhalten: (Es soll beantwortet werden ob eine Race Condition eintritt und wo)
Code:
public enum Action{open, close}
Action action; //global definiert
//Lichtschranke //Türsteuerung
while(...) { while(..) {
if(activated()) if(action == Action.open)
action = Action.open; door.open()
else else
action = Acion.close; door.close()
} }
Nun kann hierbei eine Race Condition auftreten, action ist global Definiert. Somit existiert nur ein Objekt für die Lichtschranke und die Türsteuerung. Das Datenelement wird sowohl geschrieben als auch gelesen, das würde schon eine Synchronisation nötig machen. Die Race Condition tritt hier jedoch bei beiden in der while Schleife ein. Die Lichtschranke schreibt action und zur gleichen Zeit kann es passieren das die Türsteuerung in der if Abfrage action lesen möchte. Wenn nun die Lichtschranke zu erst dran kommt und zwischenzeitlich bevor zu ende geschrieben werden konnte ein Threadwechsel passiert liest die Tür einen Falschen wert.
Das wäre erst einmal meine Antwort.
Nun geht es aber weiter und da komme ich nicht ganz mit.
Code:
public class Semaphore { //Mutex
void p() {}
void v() {}
}
...
Semaphore s = new Semaphore();
...
//Lichtschranke
s.p();
while(...) {
if(activated()) action = Action.open;
else action = Action.close;
}
s.v();
//Türsteuerung
s.p();
while(...) {
if(action == Action.open) door.open();
else door.close();
}
s.v();
Wenn ich das jetzt korrekt verstehe ist der Semaphore nicht Global Definiert. Somit hätte jede Klasse (Objekt) dann seinen eigenen Semaphore. Dann bringt diese ändern überhaupt nichts oder Der Semaphore würde bei s.p() runtergezählt werden, der Kritische Abschnitt betretten werden und einfach wieder verlassen werden über s.v();. Davon bekommt das jeweils andere Objekt nichts mit. Die Race Condition wäre damit nicht beseitigt.
Über sehe ich hierbei etwas? Birgt diese Semaphore Implementierung noch irgendwelche Nebeneffekte (Fehler)?