{"id":442,"date":"2015-10-17T22:23:51","date_gmt":"2015-10-17T20:23:51","guid":{"rendered":"http:\/\/www.steffen-liersch.de\/content\/de\/?p=442"},"modified":"2025-03-02T11:30:25","modified_gmt":"2025-03-02T10:30:25","slug":"threads-and-deadlocks","status":"publish","type":"post","link":"https:\/\/www.steffen-liersch.de\/content\/de\/2015\/10\/threads-and-deadlocks\/","title":{"rendered":"Threads und Deadlocks"},"content":{"rendered":"<p>Der Einsatz von Sperren zur Thread-Synchronisation birgt immer ein Deadlock-Risiko. <a href=\"http:\/\/de.wikipedia.org\/wiki\/Deadlock\" rel=\"noopener\">Blockierungen<\/a> treten dann auf, wenn zwei Sperren in unterschiedlicher Reihenfolge benutzt werden. Das folgende Beispiel\u00a0zeigt\u00a0exemplarisch eine fehlerhafte Implementierung, die im Multithreading-Einsatz zu Deadlocks f\u00fchren wird.<!--more--><\/p>\n<pre><code class=\"cs\">public void Foo1()\r\n{\r\n  lock(m_SyncRoot1)\r\n  {\r\n    ...\r\n    lock(m_SyncRoot2)\r\n    {\r\n    }\r\n    ....\r\n  }\r\n}\r\n\r\npublic void Foo2()\r\n{\r\n  lock(m_SyncRoot2)\r\n  {\r\n    ...\r\n    lock(m_SyncRoot1)\r\n    {\r\n    }\r\n    ....\r\n  }\r\n}<\/code><\/pre>\n<p>Solche Fehler sind schwer zu finden, da sie meist nur sporadisch auftreten. Noch schwerer wird es, wenn die Sperren durch aufgerufene Funktionen angefordert\u00a0werden. Deshalb sollten immer Ma\u00dfnahmen getroffen werden, um Deadlocks von vornherein zu unterbinden.<\/p>\n<h2>Lokaler Einsatz von Sperren<\/h2>\n<p>Durch den lokalen Einsatz von Sperren k\u00f6nnen\u00a0Deadlocks vermieden werden, wenn\u00a0weitere Bedingungen erf\u00fcllt sind:<\/p>\n<ol>\n<li>Das\u00a0Synchronisationsobjekt (auch Mutex oder CriticalSection) wird nur lokal benutzt, also z.B. innerhalb einer Klasse.<\/li>\n<li>Innerhalb von synchronisierten Bereichen werden keine\u00a0Ereignisse (Delegates bzw. Callbacks) aufgerufen.<\/li>\n<li>Innerhalb von\u00a0synchronisierten Bereichen werden keine virtuellen Funktionen aufgerufen.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Der Einsatz von Sperren zur Thread-Synchronisation birgt immer ein Deadlock-Risiko. Blockierungen treten dann auf, wenn zwei Sperren in unterschiedlicher Reihenfolge benutzt werden. Das folgende Beispiel\u00a0zeigt\u00a0exemplarisch eine fehlerhafte Implementierung, die im Multithreading-Einsatz zu Deadlocks f\u00fchren wird.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28],"tags":[25,27,19,20],"class_list":["post-442","post","type-post","status-publish","format-standard","hentry","category-multi-threading","tag-cs","tag-cpp","tag-basics","tag-multi-threading"],"_links":{"self":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/442","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/comments?post=442"}],"version-history":[{"count":8,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/442\/revisions"}],"predecessor-version":[{"id":651,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/442\/revisions\/651"}],"wp:attachment":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/media?parent=442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/categories?post=442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/tags?post=442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}