<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Dekker-Algorithmus</id>
	<title>Dekker-Algorithmus - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Dekker-Algorithmus"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Dekker-Algorithmus&amp;action=history"/>
	<updated>2026-05-28T07:30:05Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Dekker-Algorithmus&amp;diff=377085&amp;oldid=prev</id>
		<title>imported&gt;Renardo la vulpo: die Variable &quot;turn&quot; aus dem englischen Artikel heißt hier &quot;last_thread&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Dekker-Algorithmus&amp;diff=377085&amp;oldid=prev"/>
		<updated>2024-03-20T18:25:50Z</updated>

		<summary type="html">&lt;p&gt;die Variable &amp;quot;turn&amp;quot; aus dem englischen Artikel heißt hier &amp;quot;last_thread&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;Dekker-Algorithmus&amp;#039;&amp;#039;&amp;#039; ist die älteste bekannte vollständige Lösung&amp;lt;ref&amp;gt;E. W. Dijkstra: &amp;quot;Cooperating sequential processes&amp;quot;, Technological University, Eindhoven, The Netherlands, September 1965&amp;lt;/ref&amp;gt; des Problems, den wechselseitigen Ausschluss ([[Mutex]]) in der dezentralen Steuerung von [[Prozess (Computer)|Prozessen]] ([[Prozesssynchronisation]]) zu gewährleisten. Er vermeidet gegenseitiges Blockieren ([[Deadlock (Informatik)|Deadlock]]) und gewährleistet, dass stets genau ein Prozess in einen [[Kritischer Abschnitt|kritischen Abschnitt]] gelangen kann ([[Sequentialisierung]]). Der Algorithmus wurde 1965 von dem niederländischen Mathematiker [[Theodorus Dekker]] formuliert.&amp;lt;ref&amp;gt;Joe Duffy: &amp;quot;Concurrent Programming on Windows&amp;quot;, Addison-Wesley Professional, 2008&amp;lt;/ref&amp;gt; In der hier beschriebenen Form kann er aber nur zwei Prozesse wechselseitig ausschließen.&lt;br /&gt;
&lt;br /&gt;
== Schema ==&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus kann mit folgendem C-Code schematisch beschrieben werden:&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Willensbekundungen, den kritischen Abschnitt betreten zu wollen&lt;br /&gt;
volatile boolean wants_to_enter[2] = { false, false };&lt;br /&gt;
// letzter Thread, bei Konflikten der jeweils wartende Thread&lt;br /&gt;
volatile int     last_thread = 1; // Initialisierung kann mit 0 oder 1 erfolgen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Thread 0&lt;br /&gt;
wants_to_enter[0] = true;&lt;br /&gt;
while (wants_to_enter[1]) {&lt;br /&gt;
    if (last_thread == 0) { //°&lt;br /&gt;
        wants_to_enter[0] = false;&lt;br /&gt;
        while (last_thread == 0) &lt;br /&gt;
            ;&lt;br /&gt;
        wants_to_enter[0] = true;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// hier kritischen Abschnitt einfügen&lt;br /&gt;
last_thread = 0;&lt;br /&gt;
wants_to_enter[0] = false;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Thread 1&lt;br /&gt;
wants_to_enter[1] = true;&lt;br /&gt;
while (wants_to_enter[0]) {&lt;br /&gt;
    if (last_thread == 1) { //°&lt;br /&gt;
        wants_to_enter[1] = false;&lt;br /&gt;
        while (last_thread == 1) &lt;br /&gt;
            ;&lt;br /&gt;
        wants_to_enter[1] = true;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// hier kritischen Abschnitt einfügen&lt;br /&gt;
last_thread = 1;&lt;br /&gt;
wants_to_enter[1] = false;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-size:90%&amp;quot;|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// °) Im Fall, dass&lt;br /&gt;
// * ein Thread den kritischen Abschnitt betreten möchte,&lt;br /&gt;
// * der andere Thread diesen aber auch betreten möchte oder betreten hat,&lt;br /&gt;
// * lässt der Thread, der das letzte Mal zum Zuge gekommen ist&lt;br /&gt;
//   - dem anderen Thread die Vorfahrt und setzt seinen Eintrittswunsch so lange zurück&lt;br /&gt;
//   - bis der andere fertig ist&lt;br /&gt;
// * pocht der Thread, der das letzte Mal nicht zum Zuge gekommen ist&lt;br /&gt;
//   - auf die Erteilung der Semaphore&lt;br /&gt;
// * Neben dem Ausbalancieren der Eintrittschancen ist zusätzlich geklärt&lt;br /&gt;
//   - wer zurückzutreten und zu warten hat und damit die Richtung der Signalisierung&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Der Dekker-Algorithmus für zwei Prozesse arbeitet mit drei Variablen.&lt;br /&gt;
Zwei geben den Wunsch des Betretens des kritischen Abschnitts an &amp;lt;code&amp;gt;wants_to_enter&amp;lt;/code&amp;gt;, eine den letzten benutzenden Thread &amp;lt;code&amp;gt;last_thread&amp;lt;/code&amp;gt;.&lt;br /&gt;
Der letzte benutzende Thread trägt sich noch am Ende des kritischen Abschnitts als letzten benutzenden Thread ein und stellt sich damit bei einem Konflikt&lt;br /&gt;
hinten an.&lt;br /&gt;
&lt;br /&gt;
Für ihn sieht beim nächsten Aufruf, wenn der andere noch nicht zum Zuge gekommen ist, das Eintreten so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
wants_to_enter[me] = true;&lt;br /&gt;
while (wants_to_enter[other]) {&lt;br /&gt;
    wants_to_enter[me] = false;  // Rückstellung&lt;br /&gt;
    while (last_thread == me)    // Warte, bis der andere durch ist °)&lt;br /&gt;
        ;&lt;br /&gt;
    wants_to_enter[me] = true;&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
wants_to_enter[me] = false;      // Löst °°)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für den anderen Thread (man beachte, das &amp;lt;code&amp;gt;me&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;other&amp;lt;/code&amp;gt; jeweils dem &amp;lt;code&amp;gt;other&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;me&amp;lt;/code&amp;gt; des anderen Threads entsprechen):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
wants_to_enter[me] = true;&lt;br /&gt;
while (wants_to_enter[other])  // Poche auf meine Anforderung, °°)&lt;br /&gt;
    ;&lt;br /&gt;
...&lt;br /&gt;
last_thread = me;              // Löst °)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bedeutung ==&lt;br /&gt;
Im Gegensatz zu früher gefundenen Lösungen zur dezentralen Steuerung arbeitet der Dekker-Algorithmus aufgrund der Variable &amp;lt;code&amp;gt;last_thread&amp;lt;/code&amp;gt; auch dann korrekt, wenn das [[Scheduling]] abwechselnd zwischen beiden Prozessen hin und her springt. Eine generalisierte Lösung zur Synchronisation von &amp;#039;&amp;#039;N&amp;#039;&amp;#039; Prozessen wurde ebenfalls noch 1965 von [[Edsger W. Dijkstra]] gefunden.&amp;lt;ref&amp;gt;E. W. Dijkstra: &amp;quot;Solution of a Problem in Concurrent Programming Control&amp;quot;, Communications of the ACM, Volume 8 Issue 9, 1965, S. 569&amp;lt;/ref&amp;gt;&lt;br /&gt;
Eine Vereinfachung findet sich im ebenfalls korrekt arbeitenden [[Peterson-Algorithmus]], der jedoch erst 16 Jahre später entwickelt wurde. Der Nachteil der dezentralen Steuerung bleibt bestehen: Wartende Prozesse geben den [[Prozessor]] nicht ab, sondern beanspruchen ihn durch [[Aktives Warten|Busy waiting]].&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmus]]&lt;br /&gt;
[[Kategorie:Betriebssystemtheorie]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Renardo la vulpo</name></author>
	</entry>
</feed>