<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Deadlocks absichtlich programmieren]]></title><description><![CDATA[<p>Hi,<br />
ich bin mir zwar im Klaren wie ein Deadlock definiert ist, und wie ein solcher entsteht, doch fehlt mir ein Ansatzpunkt zur Programmierung.<br />
Ich habe vor 2 Prozesse ablaufen zu lassen, wobei einer zuerst ein txt File reserviert und anschließend den Drucker und ein zweiter Thread zur selben Zeit zuerst den Drucker und dann das txt File reserviert.<br />
Nun geht es mir um Folgendes: wie ist es möglich eine Ressource zu reservieren? Wenn ich beispielshalber ein Textfile öffne, und dann ein zweiter Prozess versucht das Selbige zu machen, kommt es doch schlichtweg zu einer Access Violation. Hat also jemand einen Hinweis für mich?<br />
Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/123262/deadlocks-absichtlich-programmieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Jul 2026 18:36:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/123262.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Oct 2005 12:52:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 12:52:28 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich bin mir zwar im Klaren wie ein Deadlock definiert ist, und wie ein solcher entsteht, doch fehlt mir ein Ansatzpunkt zur Programmierung.<br />
Ich habe vor 2 Prozesse ablaufen zu lassen, wobei einer zuerst ein txt File reserviert und anschließend den Drucker und ein zweiter Thread zur selben Zeit zuerst den Drucker und dann das txt File reserviert.<br />
Nun geht es mir um Folgendes: wie ist es möglich eine Ressource zu reservieren? Wenn ich beispielshalber ein Textfile öffne, und dann ein zweiter Prozess versucht das Selbige zu machen, kommt es doch schlichtweg zu einer Access Violation. Hat also jemand einen Hinweis für mich?<br />
Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/892315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892315</guid><dc:creator><![CDATA[product_key]]></dc:creator><pubDate>Fri, 14 Oct 2005 12:52:28 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 13:00:03 GMT]]></title><description><![CDATA[<p>DB bzw. OS?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/892322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892322</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Fri, 14 Oct 2005 13:00:03 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 15:31:12 GMT]]></title><description><![CDATA[<p>Windows XP.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/892460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892460</guid><dc:creator><![CDATA[product_key]]></dc:creator><pubDate>Fri, 14 Oct 2005 15:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 16:18:58 GMT]]></title><description><![CDATA[<p>Ein Deadlock ist ein Laufzeitfehler in einem Programm, der dafür sorgt, dass das Programm nicht mehr weiterläuft. Das kann zum Beispiel auftreten, wenn 2 Threads aufeinander warten und dadurch keiner von beiden jemals signalisiert werden kann.</p>
<p>Willst du nun den Zugriff auf Drucker und Datei zwischen den zwei Prozessen so regeln, dass nur jeweils ein Prozess darauf zugreifen kann oder willst du diesen Fehler erzeugen, worauf das &quot;absichtlich&quot; in deinem Titel schließen würde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/892488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892488</guid><dc:creator><![CDATA[masterofx32]]></dc:creator><pubDate>Fri, 14 Oct 2005 16:18:58 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 16:30:25 GMT]]></title><description><![CDATA[<p>Ich will einen Deadlock wie folgt absichtlich herbeiführen:<br />
-ProzessA reserviert den Drucker<br />
-ProzessB reserviert ein Textfile<br />
-ProzessA versucht nun das Textfile zu reservieren, dass allerdings von ProzessB blockiert wird<br />
-ProzessB versucht nun den Drucker zu reservieren, der allerdings von ProzessA blockiert wird<br />
--&gt; Deadlock<br />
Meine Frage ist nun wie kann ich mittels C++ eine Ressource &quot;reservieren&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/892492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892492</guid><dc:creator><![CDATA[product_key]]></dc:creator><pubDate>Fri, 14 Oct 2005 16:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 16:59:37 GMT]]></title><description><![CDATA[<p>gar nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/892516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892516</guid><dc:creator><![CDATA[:p]]></dc:creator><pubDate>Fri, 14 Oct 2005 16:59:37 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 17:01:50 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=1819" rel="nofollow">kingruedi</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=8" rel="nofollow">Rund um die Programmierung</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=4" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/892519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892519</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Fri, 14 Oct 2005 17:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 19:54:36 GMT]]></title><description><![CDATA[<p>Um den Zugriff auf Ressourcen durch verschiedene Threads zu regeln, werden unter Windows Mutex-Objekte verwendet. Diese Können sich sich immer im Besitz von maximal einem Thread befinden. In der Programmlogik koppelt man dann den Zugriff auf seine Ressource mit dem Besitz des Mutexes.<br />
Im einfachsten Fall würde man also für Drucker und Textdatei jeweils ein Mutex erstellen, dessen Besitz sich der Thread aneignet, der darauf zugreifen will.</p>
<p>Unter Windows gibt es dafü die folgenden Funktionen:</p>
<pre><code class="language-cpp">HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);
//Erzeugt ein Mutex-Objekt

DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
//Im Fall eines Mutex wird der Besitz des Mutex-Objektes angefordert.
//Der Besitz kann erlangt werden, wenn der Thread, der das Mutex-Objekt
//momentan im Besitz hat es mit ReleaseMutex freigibt. Der aktuelle Thread
//wird so lange blockiert bis der Fall eintritt.

BOOL ReleaseMutex(HANDLE hMutex);
//Der aktuelle Thread gibt das Mutex-Objekt frei.
</code></pre>
<pre><code class="language-cpp">void ThreadfunktionDie1000MalAufgerufenWird() {
    WaitForSingleObject(FileMutex,INFINITE);
        //Mutex ist jetzt im Besitz, Datei kann beschrieben werden.
    ReleaseMutex(FileMutex); //Fertig mit dem Dateizugriff, Mutex freigeben
}
</code></pre>
<p>In deinem spezifischen Fall kannst du einfach ein Deadlock erzeugen, indem du in Thread A das Drucker-Mutex in Besitz nimmst. Thread B macht das gleiche mit dem Textfile-Mutex. Wenn jetzt beide ihr eigenes Mutex nicht mehr freigeben und auf das andere warten, ist das ein Deadlock. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/892615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892615</guid><dc:creator><![CDATA[masterofx32]]></dc:creator><pubDate>Fri, 14 Oct 2005 19:54:36 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 19:57:13 GMT]]></title><description><![CDATA[<p>schreib einfach ein programm mit threads (die fahrzeuge) zum straßenverkehr, vorfahrt von rechts. 4 Autos an einer kreuzung -&gt; deadlock.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/892616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892616</guid><dc:creator><![CDATA[hepp]]></dc:creator><pubDate>Fri, 14 Oct 2005 19:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to Deadlocks absichtlich programmieren on Fri, 14 Oct 2005 20:18:54 GMT]]></title><description><![CDATA[<p>:p schrieb:</p>
<blockquote>
<p>gar nicht</p>
</blockquote>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

struct res
{
   bool locked;
   char *name;      
};

struct res printer = {false, &quot;printer&quot;};
struct res textfile = {false, &quot;textfile&quot;};

void getRessource (char *p, struct res *r)
{    
    printf (&quot;process %s wants %s\n&quot;, p, r-&gt;name);    
    while (r-&gt;locked == true)
    {
       // spin until free
       printf (&quot;process %s locked!!!\n&quot;, p);
       Sleep(500);
    }
    r-&gt;locked = true;     
    printf (&quot;process %s has %s\n&quot;, p, r-&gt;name);    
}

void processA()
{
   getRessource (&quot;A&quot;, &amp;printer);
   getRessource (&quot;A&quot;, &amp;textfile);
}

void processB()
{
   getRessource (&quot;B&quot;, &amp;textfile);
   getRessource (&quot;B&quot;, &amp;printer);
}

int main(int argc, char *argv[])
{
   while(1)
   {
      processA();
      processB();        
   }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/892622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/892622</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Fri, 14 Oct 2005 20:18:54 GMT</pubDate></item></channel></rss>