{"id":435,"date":"2011-07-26T20:50:07","date_gmt":"2011-07-26T18:50:07","guid":{"rendered":"http:\/\/www.steffen-liersch.de\/content\/de\/?p=435"},"modified":"2025-03-02T11:30:52","modified_gmt":"2025-03-02T10:30:52","slug":"auto-thread-synchronization","status":"publish","type":"post","link":"https:\/\/www.steffen-liersch.de\/content\/de\/2011\/07\/auto-thread-synchronization\/","title":{"rendered":"Automatische Thread-Synchronisation"},"content":{"rendered":"<p>Werden mehrere Abarbeitungspfade (Threads) innerhalb eines Prozesses verwendet, sind Ma\u00dfnahmen zur Thread-Synchronisation notwendig, um <a href=\"http:\/\/de.wikipedia.org\/wiki\/Race_Condition\" rel=\"noopener\">Wettlaufsituationen (Race Conditions)<\/a> auf gemeinsam genutzte Ressourcen (meist Speicher) zu verhindern.<!--more--><\/p>\n<h2>Das ThreadStatic-Attribut<\/h2>\n<p>Normale statische Variablen existieren nur einmal pro Prozess. Wenn diese zur Speicherung konstanter Werte dienen, ist es in den meisten F\u00e4llen kein Problem, wenn mehrere Threads gleichzeitig darauf zugreifen.<\/p>\n<p>Ist es hingegen sinnvoll, pro Thread eine eigenst\u00e4ndige Variable zu benutzen, um Wettlaufsituationen von vornherein zu vermeiden, k\u00f6nnen statische Variablen mit dem ThreadStatic-Attribut gekennzeichnet werden. Derartige Variablen werden automatisch pro Thread erzeugt.<\/p>\n<pre><code class=\"cs\">[ThreadStatic]\r\nstatic StringBuilder m_SB;<\/code><\/pre>\n<p>Auf eine Inline-Initialisierung sollte verzichtet werden, da diese nur einmal f\u00fcr den Hauptabarbeitungspfad (Main Thread) durchgef\u00fchrt wird. Stattdessen empfiehlt sich die Kapselung der Variablen. Der Zugriff kann dann \u00fcber eine statische Eigenschaft erfolgen, die automatisch f\u00fcr die notwendige Initialisierung sorgt.<\/p>\n<pre><code class=\"cs\">protected StringBuilder SB\r\n{\r\n  get\r\n  {\r\n    if(m_SB==null)\r\n      m_SB=new StringBuilder();\r\n\r\n    return m_SB;\r\n  }\r\n}<\/code><\/pre>\n<p>Nicht mehr ben\u00f6tigte Instanzen werden vom Garbage Collector automatisch freigegeben. Instanzen, die eine explizite Freigabe ben\u00f6tigen, also beispielsweise IDisposable implementieren, sollten nicht in diesem Zusammenhang verwendet werden, da keine\u00a0kontrollierte, explizite Freigabe m\u00f6glich ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Werden mehrere Abarbeitungspfade (Threads) innerhalb eines Prozesses verwendet, sind Ma\u00dfnahmen zur Thread-Synchronisation notwendig, um Wettlaufsituationen (Race Conditions) auf gemeinsam genutzte Ressourcen (meist Speicher) zu verhindern.<\/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":[21,25,20],"class_list":["post-435","post","type-post","status-publish","format-standard","hentry","category-multi-threading","tag-net","tag-cs","tag-multi-threading"],"_links":{"self":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/435","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=435"}],"version-history":[{"count":4,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/435\/revisions"}],"predecessor-version":[{"id":653,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/435\/revisions\/653"}],"wp:attachment":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/media?parent=435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/categories?post=435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/tags?post=435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}