Race Condition — Änderungen 7790 → 11431

Zeile 2: Zeile 2:
  
 
== Beispiel ==
 
== Beispiel ==
−
Wie könnte eine Race Condition aussehen? Meistens handelt es sich um zwei [[Prozess|Prozesse]], die die gleiche Funktion ausführen. Nehmen wir also eine hypothetische Funktion namens I_want_the_printer_now(), die den Drucker für den aktuellen Prozess reserviert, damit kein anderer Prozess darauf zugreifen kann. Außerdem gibt es eine Funktion, die den Drucker wieder freigibt, release_printer(). Der Code könnte zum Beispiel so aussehen:
+
Wie könnte eine Race Condition aussehen? Meistens handelt es sich um zwei [[Prozess|Prozesse]], die die gleiche Funktion ausführen. Nehmen wir also eine hypothetische Funktion namens <code>I_want_the_printer_now()</code>, die den Drucker für den aktuellen Prozess reserviert, damit kein anderer Prozess darauf zugreifen kann. Außerdem gibt es eine Funktion, die den Drucker wieder freigibt, <code>release_printer()</code>. Der Code könnte zum Beispiel so aussehen:
−
<c>static int printer_reserved = 0;
+
<syntaxhighlight lang="c">
 +
static int printer_reserved = 0;
  
 
void I_want_the_printer_now()
 
void I_want_the_printer_now()
Zeile 14: Zeile 15:
 
{
 
{
 
   printer_reserved = 0;
 
   printer_reserved = 0;
−
}</c>
+
}</syntaxhighlight>
  
 
Wenn ein Prozess drucken möchte, macht er das folgendermaßen:
 
Wenn ein Prozess drucken möchte, macht er das folgendermaßen:
−
<c>I_want_the_printer_now();
+
<syntaxhighlight lang="c">
 +
I_want_the_printer_now();
 
//Drucken, drucken, drucken...
 
//Drucken, drucken, drucken...
−
release_printer()</c>
+
release_printer()
 +
</syntaxhighlight>
  
−
Was passiert nun, wenn zwei Prozesse versuchen, zu drucken? Normalerweise wird zuerst I_want_the_printer_now() ausgeführt, dann unterbricht der Scheduler während des Druckens und der nächste Prozess stellt fest, dass der Drucker belegt ist. Das läuft dann so ab:
+
Was passiert nun, wenn zwei Prozesse versuchen, zu drucken? Normalerweise wird zuerst <code>I_want_the_printer_now()</code> ausgeführt, dann unterbricht der Scheduler während des Druckens und der nächste Prozess stellt fest, dass der Drucker belegt ist. Das läuft dann so ab:
 
<center>
 
<center>
 
{| {{Prettytable}} cellpadding="5"
 
{| {{Prettytable}} cellpadding="5"