<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Software Dev Blog &#187; Basics</title>
	<atom:link href="http://www.software-dev-blog.de/tag/basics/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.software-dev-blog.de</link>
	<description>Multicore-Programmierung, Multithreading &#38; Visual Computing</description>
	<lastBuildDate>Thu, 09 Feb 2012 19:54:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>OOP 2011: Stephen Blair-Chappell über die Parallelisierung von Anwendungen</title>
		<link>http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-die-parallelisierung-von-anwendungen/01/2011/</link>
		<comments>http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-die-parallelisierung-von-anwendungen/01/2011/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 08:15:08 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[Interview]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1465</guid>
		<description><![CDATA[Während der OOP 2011 in München hatte ich die Gelegenheit mit Stephen Blair-Chappell zu sprechen, der auf der Entwicklerkonferenz am zweiten Tag seinen Vortrag hielt. Die Präsentation lief unter dem Titel &#8220;Introducing parallelism into legacy code: Three case studies&#8221;. Kurz danach stand uns Stephen für drei kurze Fragen parat: In welche Fallen tappen Software-Entwickler gemeinhin, [...]]]></description>
			<content:encoded><![CDATA[<p>Während der <a href="http://www.software-dev-blog.de/oop-2011-ralph-de-wargny-zu-tools-und-trends-fur-software-entwickler/01/2011/">OOP 2011 in München</a> hatte ich die Gelegenheit mit Stephen Blair-Chappell zu sprechen, der auf der Entwicklerkonferenz am zweiten Tag <a href="http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-chancen-und-grenzen-der-parallel-programmierung/01/2011/">seinen Vortrag hielt</a>. Die Präsentation lief unter dem Titel &#8220;Introducing parallelism into legacy code: Three case studies&#8221;. Kurz danach stand uns Stephen für drei kurze Fragen parat:</p>
<blockquote><p>In welche Fallen tappen Software-Entwickler gemeinhin, wenn sie versuchen, seriell programmierte Anwendungen zu parallelisieren?</p></blockquote>
<blockquote><p>Gibt es Fälle, in denen es keinen Sinn macht, Teile einer Software-Anwendung zu parallelisieren?</p></blockquote>
<blockquote><p>Existieren gute Beispiele für erfolgreiche und erfolglose Versuche, bestehenden Code zu parallelisieren?</p></blockquote>
<p>Na, dann viel Spaß mit dem Videointerview!</p>
<p><iframe title="YouTube video player" type="text/html" width="500" height="311" src="http://www.youtube.com/embed/FE_cGNMQ0jw" frameborder="0" allowFullScreen></iframe></p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-die-parallelisierung-von-anwendungen/01/2011/&via=sw_devtwits&text=OOP 2011: Stephen Blair-Chappell über die Parallelisierung von Anwendungen&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-die-parallelisierung-von-anwendungen/01/2011/&via=sw_devtwits&text=OOP 2011: Stephen Blair-Chappell über die Parallelisierung von Anwendungen&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/oop-2011-stephen-blair-chappell-uber-die-parallelisierung-von-anwendungen/01/2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Artikelempfehlungen rund um Parallelprogrammierung</title>
		<link>http://www.software-dev-blog.de/artikelempfehlungen-rund-um-parallelprogrammierung/07/2010/</link>
		<comments>http://www.software-dev-blog.de/artikelempfehlungen-rund-um-parallelprogrammierung/07/2010/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 13:35:23 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Artikel]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[Webtipp]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1413</guid>
		<description><![CDATA[Heute gibt es auf dem Sofware Dev Blog vier Artikelempfehlungen, die sich mit dem Thema Multicore und Parallelprogrammierung beschäftigen. Die Beiträge sind stellenweise zwar nicht mehr ganz taufrisch, haben aber an Aktualität nichts eingebüßt. Im Gegenteil. Der Beitrag Programmiermodelle für moderne Mehrkernarchitekturen geht ganz rudimentär auf die verschiedenen Ansätze ein, wie aus sequentiell programmierten Anwendungen [...]]]></description>
			<content:encoded><![CDATA[<p>Heute gibt es auf dem Sofware Dev Blog vier Artikelempfehlungen, die sich mit dem Thema Multicore und Parallelprogrammierung beschäftigen. Die Beiträge sind stellenweise zwar nicht mehr ganz taufrisch, haben aber an Aktualität nichts eingebüßt. Im Gegenteil.</p>
<p>Der Beitrag <a href="http://software.intel.com/en-us/articles/programmiermodelle-fr-moderne-mehrkernarchitekturen-article-in-german/" target="_blank">Programmiermodelle für moderne Mehrkernarchitekturen</a> geht ganz rudimentär auf die verschiedenen Ansätze ein, wie aus sequentiell programmierten Anwendungen parallel ablaufende Applikationen werden. Dabei zeigt der Autor die Unterschiede auf, die es unter anderem bei OpenMP, Thread-Bibliotheken, Java, C# zu berücksichtigen gilt. Ein guter Einstieg in die Welt der Parallelprogrammierung.</p>
<p>Der <a href="http://software.intel.com/en-us/articles/openmp-und-inkrementelle-parallelisierung-article-in-german/" target="_blank">zweite Artikel</a> setzt dort an, wo der erste quasi aufhört: bei einem dieser Modelle, und zwar <a href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">OpenMP</a>. Dabei will der Autor allerdings keine umfängliche Darstellung von OpenMP leisten, sondern den praktischen Nutzen darstellen. Dies geschieht mithilfe vieler nützlicher Beispiele. Und natürlich werden auch mögliche Stolperfallen wie Data Races besprochen.</p>
<p>Der dritte Artikel <a href="http://software.intel.com/en-us/articles/parallelisierung-mit-der-posix-thread-bibliothek-article-in-grman/" target="_blank">Parallelisierung mit der POSIX Thread Bibliothek </a>beschäftigt sich mit einem Thema, das hochkomplex, aber auch sehr fundamental ist: Wie multithreade ich eine Anwendung mithilfe plattformunabhängiger Pthreads? Dieses Konzept ist zwar nicht mehr State-of-the-Art, bietet dafür aber die Möglichkeit, hochperformante, parallel ablaufende Anwendungen zu programmieren. Und das Verständnis rund um das Thema Parallelprogrammierung wird mithilfe der Pthread-Kenntnisse ebenfalls geschärft.</p>
<p>Tja, und auf den vierten Artikel habe ich bereits letzte Woche <a href="http://www.software-dev-blog.de/parallelprogrammieren-lernen-mit-schach/07/2010/">aufmerksam gemacht</a>. Na dann, viel Spaß beim Lesen!</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/artikelempfehlungen-rund-um-parallelprogrammierung/07/2010/&via=sw_devtwits&text=Artikelempfehlungen rund um Parallelprogrammierung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/artikelempfehlungen-rund-um-parallelprogrammierung/07/2010/&via=sw_devtwits&text=Artikelempfehlungen rund um Parallelprogrammierung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/artikelempfehlungen-rund-um-parallelprogrammierung/07/2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Surf-Tipp: Parallel-Studio-Artikel kostenlos downloaden</title>
		<link>http://www.software-dev-blog.de/surftipp-parallel-studio-artikel-kostenlos-downloaden/06/2009/</link>
		<comments>http://www.software-dev-blog.de/surftipp-parallel-studio-artikel-kostenlos-downloaden/06/2009/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 16:50:48 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Tool]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=1068</guid>
		<description><![CDATA[Der werte Kollege Preiss von Intel war mal wieder fleißig und hat zur Parallelisierungssuite Parallel Studio einen kleinen, aber feinen Artikel erstellt. Und zwar für das Fachmagazin Elektronik Industrie, das den Beitrag kostenlos zum Download anbietet. Für aufmerksame Leser des Software Dev Blogs werden sich nicht sonderlich viele Neuigkeiten aus dem Beitrag ableiten lassen, aber [...]]]></description>
			<content:encoded><![CDATA[<p>Der werte Kollege Preiss von Intel <a title=" Workshop: parallel Programmieren mit OpenMP " href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">war mal wieder fleißig</a> und hat zur Parallelisierungssuite <a title="Mehr Infos zu Parallel Studio" href="http://www.software-dev-blog.de/happy-birthday-parallel-studio/05/2009/">Parallel Studio</a> einen kleinen, aber feinen Artikel erstellt. Und zwar für das Fachmagazin <em>Elektronik Industrie</em>, das den Beitrag <a title="Hier könnt ihr den Parallel-Studio-Artikel kostenlos downloaden" href="http://www.all-electronics.de/article/39611.html" target="_blank">kostenlos zum Download</a> anbietet.</p>
<p>Für aufmerksame Leser des Software Dev Blogs werden sich nicht sonderlich viele Neuigkeiten aus dem Beitrag ableiten lassen, aber in seiner Abgeschlossenheit trägt der Artikel doch sehr zum Verständnis von Parallel Studio bei. Zudem handelt es sich um ein PDF-Dokument, das sich sogar ausdrucken lässt. Für die analogen Zeitgenossen unter uns.</p>
<p>Der Artikel umfasst drei Seiten und geht recht detailliert auf die einzelnen Komponenten ein, also <a title="mehr Infos zum Parallel Composer" href="../serie-mit-parallel-studio-anwendungen-multithreaden/02/2009/">Parallel Composer</a>, <a title="ISC’09: Intel Parallel Inspector im Detail" href="../isc09-intel-parallel-inspector-im-detail/04/2009/">Parallel Inspector</a> und <a title="ISC’09: Intel Parallel Amplifier im Detail" href="../isc%E2%80%9909-intel-parallel-amplifier-im-detail/04/2009/">Parallel Amplifier</a>. Lustigerweise beginnt der Beitrag mit dem <a title=" Parallel Studio: Das leistet der Parallel Advisor Lite " href="http://www.software-dev-blog.de/parallel-studio-das-leistet-der-parallel-advisor-lite/05/2009/">Parallel Advisor</a>. Dieses Tool wird erst in der nächsten Version zum Parallel Studio gehören, kann allerdings heute schon als eine Art Techdemo <a title="Hier könnt ihr Parallel Advisor Lite kostenlos downloaden" href="http://software.intel.com/en-us/articles/intel-parallel-advisor-lite/" target="_blank">kostenlos ausprobiert</a> werden.</p>
<p>Schön an dem Parallel-Studio-Beitrag sind die praxisorientierten Einblicke, die man anhand der eingefügten Bilder gewinnen kann. Schade ist allerdings, dass diese teilweise recht klein geraten sind. Und ein, zwei Codebeispiele hätten dem Artikel zu ein wenig mehr Pfiff verholfen. Na ja, beim nächsten Mal dann, ok?!</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/surftipp-parallel-studio-artikel-kostenlos-downloaden/06/2009/&via=sw_devtwits&text=Surf-Tipp: Parallel-Studio-Artikel kostenlos downloaden&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/surftipp-parallel-studio-artikel-kostenlos-downloaden/06/2009/&via=sw_devtwits&text=Surf-Tipp: Parallel-Studio-Artikel kostenlos downloaden&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/surftipp-parallel-studio-artikel-kostenlos-downloaden/06/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshop: Alles über .NET-Threads &#8211; Teil 4</title>
		<link>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/</link>
		<comments>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 17:06:09 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=958</guid>
		<description><![CDATA[Eine neue Woche beginnt, und im selben Atemzug endet meine vierteilige Serie zum Thema .NET-Threads. So habe ich im ersten Kapitel über das Erzeugen von Threads geschrieben, im zweiten Teil mich über das Verwalten derselben ausgelassen, und am letzten Donnerstag war der ThreadPool und dessen Möglichkeiten dran. Und heute?! Nun, heute geht es um die [...]]]></description>
			<content:encoded><![CDATA[<p>Eine neue Woche beginnt, und im selben Atemzug endet meine vierteilige Serie zum Thema .NET-Threads. So habe ich <a title="Teil eins der .NET-Thread-Serie" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">im ersten Kapitel</a> über das Erzeugen von Threads geschrieben, <a title="Teil zwei der .NET-Thread-Serie" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/">im zweiten Teil</a> mich über das Verwalten derselben ausgelassen, und am letzten Donnerstag war der <a title="Teil drei der .NET-Thread-Serie" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/">ThreadPool</a> und dessen Möglichkeiten dran. Und heute?! Nun, heute geht es um die Synchronisierung mehrerer Threads und atomare Aktionen.</p>
<p>Zunächst einmal kann man festhalten, dass die Thread-Synchronisierung im .NET-Framework ähnlich funktioniert wie im Win32- oder Pthreads-Umfeld. Es geht also um den gegenseitigen Ausschluss sowie um atomare Aktionen auf spezielle Variablen. Wie bei der von C# bekannten Methode <em><strong>lock</strong></em> wird ein Codeabschnitt mithilfe der geschweiften Klammern geblockt, sodass zu dieser Zeit nur ein einziger Thread darauf zugreifen kann. Hierfür bietet das .NET-Framework eine ähnliche Konstrukte:</p>
<p><em><strong>Monitor.Enter ( this )<br />
try<br />
{<br />
<span style="color: #ffffff;">&#8230;&#8230;. </span>shared_var = other_shared_var +1;<br />
<span style="color: #ffffff;">&#8230;&#8230;. </span>other_shared_var = 0;<br />
}<br />
finally<br />
{<br />
<span style="color: #ffffff;">&#8230;&#8230; </span> Monitor.Exit ( this )<br />
}</strong></em></p>
<p>Mit der Klasse <em><strong>Monitor</strong></em> wird der entsprechende Codeabschnitt blockiert. Mit <em><strong>Enter()</strong></em> wird der Abschnitt gesperrt und mit <em><strong>Exit()</strong></em> wieder freigegeben. Praktisch an Monitor ist auch dessen Möglichkeit, Datenstrukturen als Parameter zu übergeben.</p>
<p>Bei Monitor.Enter() geschehen übrigens zwei Dinge: Erstens wird eine Warteschlange eingerichtet, die auf diejenigen Threads verweist, die gesperrt werden sollen und eine zweite Queue mit Threads, die darüber informiert werden wollen, wenn eine Speere verfügbar ist. <em><strong>Monitor.Exit()</strong></em> sorgt dafür, dass der erste verfügbare Thread in Warteschlange #1 gesperrt wird.</p>
<p><span id="more-958"></span>Darüber hinaus hält die Klasse Monitor eine weitere Methode bereit: So lässt sich mit <em><strong>Monitor.Wait()</strong></em> die Sperre eines Threads auf einen anderen Thread übertragen, um die Sperre später wieder zurückzuverlangen. Ein Impuls benachrichtigt hierbei den ursprünglichen Thread darüber, dass die Sperre wieder aufgehoben wurde.</p>
<p>Neben den Monitor-Methoden lassen sich unter .NET auch Mutexe für das Sperren und Freigeben von Threads verwenden. Im Gegensatz zu der Monitor-Klasse werden Mutexe in Verbindung mit Handles eingesetzt und können zudem zudem für mehrere Sperren eingesetzt werden, die dann natürlich genauso oft wieder freigegeben werden.</p>
<p><em><strong>private static Mutex mutx = new Mutex();<br />
&#8230;</strong></em></p>
<p><em><strong>private static void UseResource()<br />
{<br />
<span style="color: #ffffff;">&#8230;&#8230;</span>//Warten, um in den Sperrcode einzutreten<br />
<span style="color: #ffffff;">&#8230;&#8230;</span>mutx.WaitOne();</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span>Console.WriteLine( &#8221; im gesperrten Modus &#8220;);</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span>Thread.Sleep( 100 ); // 100 Millisekunden warten</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span>Console.WriteLine( &#8221; den gesperrten Modus wieder verlassen &#8220;);</strong></em></p>
<p><em><strong><span style="color: #ffffff;">&#8230;&#8230;</span>// Mutex wieder freigeben<br />
<span style="color: #ffffff;">&#8230;&#8230;</span>mutx.ReleaseMutex();</strong></em></p>
<p><em><strong>}</strong></em></p>
<p><strong>Atomare Aktionen</strong><br />
Unter atomaren Aktionen versteht man landläufig unteilbare Maschinenanweisungen, wie sie beispielsweise für Datenbankoperationen eingesetzt werden. Dabei ist es von essenzieller Wichtigkeit, dass mehrere dieser Teilschritte zurückgenommen werden können, falls der gesamte Schritt nicht beendet werden kann. Bei Threads verhält es sich ganz ähnlich: Variablen werden verändert und gleichzeitig geht beim Programmablauf etwas schief. Die Folge: Das System ist im schlimmsten Fall beschädigt oder Daten korrupt.</p>
<p>Um so etwas auszuschließen, hat Microsoft in das .NET-Framework die Klasse <strong><em>Interlock</em></strong> eingebaut, die drei wesentliche Methoden vorsieht: <em><strong>Decrement</strong></em>, <em><strong>Increment</strong></em> und <em><strong>Exchange</strong></em>. Diese sollten vor allem dann eingesetzt werden, wenn eine bestimmte Variable von mehreren Threads parallel genutzt wird:</p>
<p><em><strong>int intCounter = 0;<br />
&#8230;</strong></em></p>
<p><em><strong>Interlocked.Exchange( ref usingResource, 6 ); // Setze den Wert von intCounter auf 6</strong></em></p>
<p><em><strong>Interloced.Decrement( ref intCounter ); // Reduziere den Wert von intCounter auf 5</strong></em></p>
<p><em><strong>Interlocked.Increment( ref intCounter ); // Erhöhe den Wert von intCounter wieder auf 6</strong></em></p>
<p>Beachtenswert ist die Tatsache, dass mit Increment und Decrement nicht die Variable selbst, sondern nur der Verweis darauf verändert wird (da es sich dank des Zusatzes <em><strong>ref</strong></em> um eine Art Zeiger handelt). Und Exchange ändert nicht die Werte, sondern initialisiert lediglich einen Wert mit einem anderen.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/&via=sw_devtwits&text=Workshop: Alles über .NET-Threads - Teil 4&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/&via=sw_devtwits&text=Workshop: Alles über .NET-Threads - Teil 4&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-4/03/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshop: Alles über .NET-Threads &#8211; Teil 3</title>
		<link>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/</link>
		<comments>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 14:03:42 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=957</guid>
		<description><![CDATA[Teil eins und Teil zwei meines Minispecials zum Thema .NET-Threads stehen bereits online, und heute folgt sehr chronologisch der dritte Abschnitt. Dieser handelt von den Thread-Pools, mit deren Hilfe eine größere Anzahl von notwendigen Threads mithilfe des .NET-Frameworks verwaltet werden können. Zunächst einmal sollte man sich klar machen, dass das Erzeugen und Verwalten von .NET-Threads [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Workshop: Alles über .NET-Threads - Teil 1" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">Teil eins</a> und <a title="Workshop: Alles über .NET-Threads - Teil 2" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/">Teil zwei</a> meines Minispecials zum Thema .NET-Threads stehen bereits online, und heute folgt sehr chronologisch der dritte Abschnitt. Dieser handelt von den <strong>Thread-Pools</strong>, mit deren Hilfe eine größere Anzahl von notwendigen Threads mithilfe des .NET-Frameworks verwaltet werden können.</p>
<p>Zunächst einmal sollte man sich klar machen, dass das <a title="Das Erzeugen von Threads" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">Erzeugen</a> und <a title="Das Verwalten von .NET-Threads" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/">Verwalten</a> von .NET-Threads mit einem immensen administrativen Aufwand verbunden ist: Lokaler Thread-Speicher muss angelegt und die Systemstrukturen für die Thread-Verwaltung müssen eingerichtet werden. Darüber hinaus nimmt die Komplexität des Quellcodes deutlich zu, sobald mehrere Threads mit Bordmitteln verwaltet werden sollen.</p>
<p>Aus diesem Grund hat Microsoft dem .NET-Framework ein Ressource spendiert, die sich <em><strong>ThreadPool</strong></em> nennt. Dabei wird zunächst eine bestimmte Anzahl von Threads generiert, außerdem wird eine Art Arbeitswarteschlange erstellt. Sobald eine auszuführende Aufgabe in diese Warteschlange befördert wird, wird ein Thread für diesen Task aktiviert und ihm die Aufgabe zugewiesen. Dies erledigt das .NET-Framework automatisch. Allerdings ist dabei zu beachten, dass der ThreadPool nur dann sinnvoll eingesetzt werden kann, wenn ein Programm aus mehreren Threads besteht, die immer wieder benötigt werden.</p>
<p><span id="more-957"></span>Der Pool wird mithilfe der Anweisung <em><strong>ThreadPool.QueueUserWorkItem (new WaitCallback ( DELEGAT ) )</strong></em> erzeugt, sobald die erste Aufgabe an die Warteschlange übergeben wird. Die Anzahl der im Pool erzeugbaren Threads ist unter .NET auf 25 pro Hardware-Prozessor begrenzt. Allerdings kann man mithilfe der Methoden <em><strong>GetMinThreads()</strong></em> und <em><strong>SetMinThreads()</strong></em> die minimale Anzahl von Threads abfragen bzw. erzwingen. Mit <em><strong>GetMaxThreads()</strong></em> lässt sich die maximale Anzahl von Threads bestimmen.</p>
<p>Mit den ThreadPools in .NET lassen sich aber nicht nur Aufgaben parallel ausführen, sondern auch asynchrones Warten erzwingen. So kann beispielsweise auf einen Datenanfrage innerhalb des Netzwerks reagiert werden. Hierfür ist eine sogenannte Callback-Funktion erforderlich, die beim Eintreten eines zu erwartenden Ereignisses aufgerufen wird. Eine dieser Funktionen nennt sich <em><strong>RegisterWaitForSingleObjekct()</strong></em>, die die Angabe einer maximalen Wartezeit erlaubt. Die Callback-Funktion wird aufgerufen, wenn das Ereignis eintritt oder die definierte Wartezeit abgelaufen ist.</p>
<p>Aber nicht nur einzelne Ereignisse können Threads starten, sondern auch eine ganze Reihe davon. Hierfür existieren die Methoden <em><strong>WaitHandle.WaitAll()</strong></em> und <em><strong>WaitHandle.WaitAny()</strong></em>, die ausgeführt werden, wenn alle Ereignisse oder irgendein Ereignis eintreten. Zudem lassen sich diese manuell mithilfe der Methode <em><strong>ManualResetEvent()</strong></em> zurücksetzen.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/&via=sw_devtwits&text= Workshop: Alles über .NET-Threads - Teil 3&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/&via=sw_devtwits&text= Workshop: Alles über .NET-Threads - Teil 3&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-3/03/2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Workshop: Alles über .NET-Threads &#8211; Teil 2</title>
		<link>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/</link>
		<comments>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 12:10:53 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=956</guid>
		<description><![CDATA[Meine kleine .NET-Serie zum Thema Threads geht heute in die zweite Runde. Nachdem es gestern um das Erzeugen von Threads ging, handelt Teil zwei von der Thread-Verwaltung. Dabei unterscheidet man zwischen Beenden, Warten, Anhalten und Fortsetzen. Beenden von Threads: Dies geschieht am einfachsten, indem ein Thread ganz regulär während des Programmablaufs verlassen wird und die [...]]]></description>
			<content:encoded><![CDATA[<p>Meine kleine .NET-Serie zum Thema Threads geht heute in die zweite Runde. Nachdem es gestern um das <a title="Teil 1 der Miniserie &quot;Alles über .NET-Threads&quot; und deren Erzeugung" href="http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/">Erzeugen von Threads</a> ging, handelt Teil zwei von der <strong>Thread-Verwaltung</strong>. Dabei unterscheidet man zwischen Beenden, Warten, Anhalten und Fortsetzen.</p>
<p><strong>Beenden von Threads:</strong> Dies geschieht am einfachsten, indem ein Thread ganz regulär während des Programmablaufs verlassen wird und die Anwendung wieder zum Masterthread zurückkehrt. Dies gibt der Common Language Runtime (CLR) die Möglichkeit, die notwendigen Aufräumarbeiten durchzuführen. Allerdings muss manchmal ein anderer als der gerade laufende Thread beendet werden. Daher hat Microsoft den .NET-Thread-APIs eine Methode spendiert, die sich <em><strong>Abort()</strong></em> nennt, mit deren Hilfe ein laufender Thread abgebrochen werden kann. Beim Aufruf von Abort() wird automatisch eine ThreadAbortException ausgelöst.</p>
<p>Der Aufruf von Abort() zieht übrigens eine Reihe verschiedener Dinge nach sich. Dazu gehört die Fähigkeit des Threads, den eigenen Abbruch zu vereiteln, indem er innerhalb des Exception-Handlers die Methode <em><strong>System.Threading.Thread.ResetAbort</strong></em> aufruft. Daneben besteht die Möglichkeit, innerhalb eines Codeblocks mithilfe von <em><strong>finally</strong></em> weiteren Quellcode ausführen zu lassen, was im ungünstigsten Fall eine beachtliche Verzögerung des Thread-Abbruchs nach sich zieht. Aus diesen beiden Gründen sollte man zur Laufzeit überprüfen, ob ein bestimmter Thread auch vollständig abgebrochen wurde. Hierfür steht die <em><strong>Join</strong></em>-Methode zur Verfügung.</p>
<p><span id="more-956"></span></p>
<p><strong>Auf einen Thread warten:</strong> Die parallele Ausführung mehrerer Threads innerhalb eines Programmes bringt es zwangsläufig mit sich, dass Threads immer wieder aufeinander warten müssen. Um dies zu erreichen, hat Microsoft dem .NET-Framework die Thread-Methode <em><strong>Join()</strong></em> verpasst, was ein Zusammenführen zweier Threads bedeutet. In der Konsequenz heißt das, dass ein Thread mit seiner Fortsetzung so lange wartet, bis ein vorhergehender Thread fertig ist. Da dies zu unliebsamen Nebeneffekten führen kann (Stichwort: Dead Lock), besteht die Möglichkeit, Join() einen Parameter zu übergeben, der einen Integerwert darstellt. Dieser Wert besagt, wie lange gewartet werden soll, bis der Vorgänger-Thread (voraussichtlich) beendet wird. Das Ergebnis von Join() ist ein boolscher Wert, der <em><strong>true</strong></em> (Thread beendet) oder <em><strong>false</strong></em> (Thread nicht beendet) annehmen kann.</p>
<p><strong>Threads anhalten und fortsetzen: </strong>Im Gegensatz zur Methode <em><strong>Sleep()</strong></em>, mit der ein Thread für eine festgelegte Zeitdauer angehalten und automatisch fortgesetzt wird, besteht eine weitere Möglichkeit, einen Thread auf unbestimmte Zeit zu stoppen und zu einem späteren Zeitpunkt wieder aufzunehmen. Die hierfür zuständigen Methoden nennen sich <em><strong>Suspend()</strong></em> und <em><strong>Resume()</strong></em>. Beiden Methoden kann kein Argument übergeben werden und beide liefern auch keinen Rückgabewert.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/&via=sw_devtwits&text= Workshop: Alles über .NET-Threads - Teil 2&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/&via=sw_devtwits&text= Workshop: Alles über .NET-Threads - Teil 2&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-2/03/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshop: Alles über .NET-Threads &#8211; Teil 1</title>
		<link>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/</link>
		<comments>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 15:41:12 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=955</guid>
		<description><![CDATA[Ende Januar, im Anschluss an die OOP 2009, habe ich hier eine kleine Miniserie mit dem Titel &#8220;Multicore-Programmierung im .NET-Umfeld&#8221; veröffentlicht. Was dabei ein wenig zu kurz kam sind die technischen Aspekte, die daraus resultieren. Wie beispielsweise Threads mithilfe des .NET-Frameworks erzeugt, verwaltet und synchronisiert werden. Und über die vorhandenen Thread-Pools habe ich ebenfalls zu [...]]]></description>
			<content:encoded><![CDATA[<p>Ende Januar, im Anschluss an die <a title=" Multicore-Programmierung auf der OOP 2009" href="http://www.software-dev-blog.de/multicore-programmierung-auf-der-oop-2009/01/2009/">OOP 2009</a>, habe ich hier <a title=" Multicore-Programmierung im .NET-Umfeld - Teil 1 " href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/">eine kleine Miniserie</a> mit dem Titel &#8220;Multicore-Programmierung im .NET-Umfeld&#8221; veröffentlicht. Was dabei ein wenig zu kurz kam sind die technischen Aspekte, die daraus resultieren. Wie beispielsweise Threads mithilfe des .NET-Frameworks erzeugt, verwaltet und synchronisiert werden. Und über die vorhandenen Thread-Pools habe ich ebenfalls zu wenig erzählt.</p>
<p>Das alles werde ich ab heute in Form einer Miniserie mit der Überschrift &#8220;Alles über .NET Threads&#8221; nachholen. Der erste Teil beschäftigt sich mit dem Thema &#8220;Threads erzeugen&#8221;.</p>
<p>Da die .NET-APIs etwas &#8220;schlanker&#8221; sind als ihre Win32-Brüder und -Schwestern, gestaltet sich das Erzeugen eines .NET-Threads relativ einfach. Dies sieht wie folgt aus:</p>
<p><em><strong>using System.Threading;</strong></em></p>
<p><em><strong>[Definition von Variablen]</strong></em></p>
<p><em><strong>Thread t = new Thread( new ThreadStart( ThreadFunc ));</strong></em></p>
<p>Der Aufruf von <strong><em>ThreadStart()</em></strong> erzeugt einen neuen Thread. Der Parameter ist eine Delegat namens <em><strong>ThreadFunc</strong></em>. Übrigens: In C# ist ein Delegat identisch mit der Adresse einer Funktion in C. Der Thread endet dann an der Stelle, sobald ThreadFunc() endet. Doch damit nicht genug. Für eine fehlerfreie Ausführung des Threads muss weiterer Code implementiert werden:</p>
<p><em><strong>t.Start()</strong></em> &#8212; Dies startet den Thread unter .NET explizit (was z. B. unter Win32 nicht erforderlich ist).</p>
<p><em><strong>Thread.Sleep( 40 ) </strong></em>&#8212; Dies unterbricht den (seriellen) Hauptthread für die Dauer der Zeiteinheit in der Klammer, die in Millisekunden angegeben wird. Dies kann in der Praxis jedoch erheblich von der tatsächlich benötigten Zeit abweichen.</p>
<p><em><strong>[aufzurufende Funktion]</strong></em> &#8212; Diese Funktion wird parallel auf den vorhandenen Prozessorkernen ausgeführt.</p>
<p><em><strong>Thread.Sleep( 0 ) </strong>&#8212; </em>Dies beendet den parallelen Thread und reaktiviert den &#8220;schlafenden&#8221; Hauptthread.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/&via=sw_devtwits&text=Workshop: Alles über .NET-Threads - Teil 1&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/&via=sw_devtwits&text=Workshop: Alles über .NET-Threads - Teil 1&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/workshop-alles-uber-net-threads-teil-1/03/2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Infos rund ums Parallele Programmieren auf MSDN</title>
		<link>http://www.software-dev-blog.de/infos-rund-ums-parallele-programmieren-auf-msdn/03/2009/</link>
		<comments>http://www.software-dev-blog.de/infos-rund-ums-parallele-programmieren-auf-msdn/03/2009/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 16:24:37 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=954</guid>
		<description><![CDATA[Heute Morgen habe ich nicht schlecht gestaunt, als mich Google Alert darüber informiert hat, dass es eine externe Verlinkung zu einem meiner Blogbeiträge gibt. Dabei handelt es sich um einen Workshop, der sich mit den Methoden der parallelen Programmierung mithilfe von OpenMP beschäftigt. Besonders bemerkenswert daran fand ich übrigens die Seite, die den Beitrag verlinkt [...]]]></description>
			<content:encoded><![CDATA[<p>Heute Morgen habe ich nicht schlecht gestaunt, als mich Google Alert darüber informiert hat, dass es eine externe Verlinkung zu einem meiner Blogbeiträge gibt. Dabei handelt es sich um einen <a title=" Workshop: parallel Programmieren mit OpenMP " href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">Workshop</a>, der sich mit den Methoden der parallelen Programmierung mithilfe von OpenMP beschäftigt.</p>
<p>Besonders bemerkenswert daran fand ich übrigens die Seite, die den Beitrag verlinkt hat: Es handelt sich um niemand geringeres als <a title="Parallele Programmierung auf MSDN" href="http://msdn.microsoft.com/de-de/concurrency/default.aspx" target="_blank">MSDN</a>, also das Entwicklerportal von Microsoft, die dem Thema Parallele Programmierung eine eigene Webseite spendiert haben. Und genau dort findet man den Link auf meinen OpenMP-Beitrag. Daneben gibt es noch weitere interessante Einstiege in die Welt der Multithreading-Entwicklung. Da erfährt man eine Menge über die Grundlagen der Parallelprogrammierung, aber auch Tools und Downloads werden dort vorgestellt.</p>
<p>Des Weiteren können interessierte Entwickler nützliche Artikel abgreifen, Webcasts und Videos angucken und Blogs lesen. Und klar, dass es auf der Webseite auch um die Themen <a title="Multicore-Programmierung unter .NET auf dem prio Powerday 2009" href="http://www.software-dev-blog.de/multicore-powerday-preise-und-weitere-infos/01/2009/">Paralleles Programmieren mit .NET</a> geht. Besonders bemerkenswert finde ich auch die Tatsache, dass MSDN für Intel eine eigene Sektion mit Namen &#8220;Intel Developer Network&#8221; spendiert hat. Dort findet man Wissenswertes zum Parallel Studio und zu anderen Themen.</p>
<p><em><strong>Fazit:</strong></em> Parallel Computing auf MSDN ist eine bookmark-taugliche Webseite, wenn man in Sachen Parallele Programmierung auf dem Laufenden bleiben will.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/infos-rund-ums-parallele-programmieren-auf-msdn/03/2009/&via=sw_devtwits&text=Infos rund ums Parallele Programmieren auf MSDN&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/infos-rund-ums-parallele-programmieren-auf-msdn/03/2009/&via=sw_devtwits&text=Infos rund ums Parallele Programmieren auf MSDN&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/infos-rund-ums-parallele-programmieren-auf-msdn/03/2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mögliche Thread-Modi und deren Folgen</title>
		<link>http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/</link>
		<comments>http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 14:55:21 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=927</guid>
		<description><![CDATA[Multicore-Programmierung ist sicherlich kein einfaches Ding. Zu viel kann dabei passieren und schiefgehen, wenn man bestimmte Regeln nicht beachtet. Daher starten wir heute einen Mehrteiler, der sich mit den Details der Multicore-Programmierung beschäftigt. Im ersten Teil geht es um die fundamentale Frage, welche Zustände ein Thread während des Programmablaufs annehmen kann. Im ersten Schritt wird [...]]]></description>
			<content:encoded><![CDATA[<p>Multicore-Programmierung ist sicherlich kein einfaches Ding. Zu viel kann dabei passieren und schiefgehen, wenn man <a title="Fünf Multithread-Programmierregeln" href="http://www.software-dev-blog.de/funf-multicore-programmierregeln-auf-einen-blick/11/2008/">bestimmte Regeln</a> nicht beachtet. Daher starten wir heute einen Mehrteiler, der sich mit den Details der Multicore-Programmierung beschäftigt. Im ersten Teil geht es um die fundamentale Frage, welche Zustände ein Thread während des Programmablaufs annehmen kann.</p>
<p>Im ersten Schritt wird beispielsweise vom Thread Manager ein Thread erzeugt und in den <strong>Bereit-Zustand</strong> versetzt (&#8220;ready&#8221;). Dort verharrt der Thread so lange, bis er eine Anweisung, eine Funktion oder ähnliches ausführen soll. Darum kümmern sich entsprechende Programmanweisungen wie zum Beispiel die Pragma-Methoden der <a title=" Workshop: parallel Programmieren mit OpenMP " href="http://www.software-dev-blog.de/parallel-programmieren-mit-openmp/02/2009/">OpenMP-basierten Programmierung</a>.</p>
<p>Im zweiten Schritt kommt es zur <strong>Ausführung</strong> der entsprechenden Quellcodestelle. Währenddessen muss der betreffende Thread möglicherweise auf einen anderen Thread oder ein Datum eines parallel ablaufenden Threads warten. Dann begibt er sich in den <strong>Wartend-Modus</strong>, bis der benötigte Thread beendet ist oder dessen Ergebnis vorliegt. Anschließend wird der angehaltene Thread weiter ausgeführt oder wieder in den Bereit-Zustand versetzt, da der Thread zu einem späteren Zeitpunkt nochmals benötigt wird.</p>
<p><strong>Ach ja:</strong> Gerade dieser Wartend-Modus bereitet vielen Programmierern erhebliche Probleme, da hierbei <a title="Von Deadlocks und anderen überraschenden Laufzeitproblemen" href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Dead Locks, Data Races</a> oder andere unvorhersehbare Ereignisse auftreten können. Wie gut, dass es hierfür Tools wie den <a title="Thread Checker" href="http://www.software-dev-blog.de/12-thesen-und-antithesen-zur-multicore-programmierung/01/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Thread Checker</a> oder <a title=" Parallel-Studio-Serie (3): mehr Infos zum Parallel Inspector " href="http://www.software-dev-blog.de/parallel-studio-serie-mehr-infos-zum-parallel-inspector/02/2009/">Parallel Inspector</a> gibt, die solche Schwachstellen aufspüren können.</p>
<p><span id="more-927"></span>Natürlich ist es auch möglich, dass ein Thread ausgeführt wird, ohne in den Wartend-Zustand versetzt zu werden. Dann stehen <strong>zwei Folgemodi</strong> zur Auswahl: <strong>Bereit </strong>oder<strong> Beendet</strong>. &#8220;Bereit&#8221; tritt immer dann ein, wenn der Thread nicht nur einmal, sondern mehrmals benötigt wird, was schon beim Programmdesign berücksichtigt werden muss. Dies kann beispielsweise eine Schleife sein, die mehrfach ausgeführt werden muss. In diesem Fall empfiehlt es sich, den zugehörigen Thread nicht zu beenden, sondern ihn wieder auf &#8220;Bereit&#8221; zu setzen, da das Erzeugen eines Threads relativ viel Rechenzeit und Verwaltungsaufwand bedeutet.</p>
<p>Sobald ein Thread nicht mehr benötigt wird, kann er natürlich auch <strong>beendet</strong> werden. Er wird dann aus dem Thread-Pool entfernt, alle Variablen werden gelöscht und der Thread steht nicht mehr zur Verfügung. Was aber nicht heißt, dass er zu einem späteren Zeitpunkt nicht wieder erzeugt werden kann.</p>
<p><strong>Übrigens:</strong> Zu Beginn einer parallelisierten Anwendung wird ein sogenannter Initial Thread initiert, der den sequeziellen Programmablauf steuert und der auch dafür zuständig ist, das Programm &#8220;am Leben zu erhalten&#8221;, während zur Laufzeit immer wieder neue, parallel ausfühbare Threads erzeugt werden. Sobald dieser Initialisierungsthread beendet wird, endet auch das komplette Programm.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/&via=sw_devtwits&text=Mögliche Thread-Modi und deren Folgen&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/&via=sw_devtwits&text=Mögliche Thread-Modi und deren Folgen&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/moegliche-thread-modi-und-deren-folgen/02/2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Multicore-Programmierung im .NET-Umfeld &#8211; Teil 3</title>
		<link>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-3/02/2009/</link>
		<comments>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-3/02/2009/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 13:37:08 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Event]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=734</guid>
		<description><![CDATA[Nach den Teilen eins und zwei folgt heute der dritte Abschnitt unserer Mini-Serie &#8220;Multicore-Programmierung im .NET-Umfeld&#8221;. Es geht um Tasks und Futures, um das Parallelisieren von Methoden, um parallele Schleifen, um einen Taskmanager und um PLINQ. Tasks sind die zentralen Elemente der Parallel Extensions, also dedizierte Aufgaben, Funktionen, Schleifenkonstrukte oder ähnliche Dinge. Eine Task führt [...]]]></description>
			<content:encoded><![CDATA[<p>Nach den <a title="Erster Teil der Mini-Serie &quot;Multicore-Programmierung im .NET-Umfeld&quot;" href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/">Teilen eins</a> und <a title="Zweiter Teil der Mini-Serie &quot;Multicore-Programmierung im .NET-Umfeld&quot;" href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/">zwei</a> folgt heute der dritte Abschnitt unserer Mini-Serie &#8220;Multicore-Programmierung im .NET-Umfeld&#8221;. Es geht um Tasks und Futures, um das Parallelisieren von Methoden, um parallele Schleifen, um einen Taskmanager und um PLINQ.</p>
<p><strong>Tasks</strong> sind die zentralen Elemente der Parallel Extensions, also dedizierte Aufgaben, Funktionen, Schleifenkonstrukte oder ähnliche Dinge. Eine Task führt stets eine Funktion oder ein anderes Konstrukt innerhalb eines Threads aus, um so eine optimale Ausnutzung der Systemressourcen zu erzielen.</p>
<p>Das Besondere daran sind die <strong>Call-Back-Funktionen</strong>, die es ermöglichen, bestimmte Dinge zu übergeben, die in einem separaten Thread ausgeführt werden sollen. Mithilfe der Tasks müssen Anwendungsprogrammierer also nicht mehr in Threads denken, da diese von den .NET-Tools automatisch erzeugt, verwaltet und auf die vorhandenen Ressourcen verteilt werden.</p>
<p>Daneben gibt es <strong>Futures</strong>, also Tasks mit Rückgabewerten. Solch ein Future-Konstrukt führt beispielsweise in einem eigenen Task eine Funktion aus, deren Ergebnis an das Hauptprogramm übergeben wird, das währenddessen weiterrechnen kann. Zwar muss das Programm an einer bestimmten Stelle auf das Ergebnis warten, kann aber trotzdem parallel andere Aufgaben ausführen. Eine weitere simultane Ausführungsoption ist die Methode <strong><em>Parallel_Invoke()</em></strong>, die einen ganzen Satz von Methoden zugleich abarbeiten kann, sofern diese voneinander unabhängig sind.</p>
<p><span id="more-734"></span>Aber auch <a title="Schleifenkonstrukte sind auch in anderen Programmiermethoden sehr beliebte Objekte der Parallelisierung" href="http://www.software-dev-blog.de/mit-intel-threading-building-blocks-parallel-programmieren/12/2008/">Schleifenkonstrukte</a> bieten sich für die parallele Programmierung an, da hier gerechnet wird, was mithilfe einer parallelen Ausführung erheblich beschleunigt werden kann. Der große Vorteil von parallelen Schleifenkonstrukten ist deren fehlende Abhängigkeit von globalen oder lokalen Variablen, die bei der sequenziellen Ausführung entstehen. Ebnenso eignet sich der parallele Datenzugriff (beispielsweise bei Datenbankanwendungen) sich bestens zum Parallelisieren.</p>
<p>Als Beispiel dient eine Matrixoperation, die mit drei Variablen arbeitet, die bei der sequenziellen Programmierung mithilfe eines dreifach-verschalteten Schleifenkonstrukts das Ergebnis der Matrixberechnung ermittelt. Bei der parallelen Schleife <em><strong>Parallel.For() </strong></em>hingegen wird nur die äußere Schleife initiiert, die zwei inneren Schleifen werden per Methode übergeben. Im Hintergrund werden dann die zwei &#8220;inneren Schleifen&#8221; auf zwei parallele Threads verteilt. Die Daten werden dann am Schluss automatisch zusammengeführt. Und so sieht der Quellcode dazu aus:</p>
<p><em><img class="aligncenter size-full wp-image-742" style="margin: 5px 10px;" title="Matrixoperation mithilfe der Parallel.For-Methode" src="http://www.software-dev-blog.de/wp-content/images/2009/02/parallel_for1.jpg" alt="Matrixoperation mithilfe der Parallel.For-Methode" width="500" /></em>Eine weitere Kernfunktion des .NET-4.0-Frameworks ist die <strong>Taksmanager-Klasse</strong>, die sich um die optimale Auslastung der Systemressourcen, sprich Prozessoren und CPU-Kerne, kümmert. Hierfür versucht der Taskmanager stets, die notwendigen WorkerThreads gleichmäßig mit Tasks zu bestücken. Das geht sogar so weit, dass &#8220;unterbeschäftigte&#8221; WorkerThreads einzelne Tasks von &#8220;überbeschäftigten&#8221; WorkerThreads erhalten, um so ein optimal ausgelastetes System zu garantieren. Die Strategie dahinter nennt sich &#8220;Work Stealing&#8221;. Der Taskmanager ist übrigens beliebig konfigurierbar und ermittelt unter anderem die vorhandene Anzahl an Prozessoren.</p>
<p>Aber nicht nur die Parallelisierung von Berechnungen, sondern auch der <strong>simultane Datenzugriff</strong> wird bei .NET 4.0 im Vordergrund stehen. Hierfür wird die seit .NET 3.5 verfügbare Spracherweiterung LINQ (Language Integrated Query) parallelisiert, woraus <strong>PLINQ</strong> entsteht. Mit PLINQ kann man typsicher auf bestimmte Behälterklassen zugreifen, also auf Arrays, Listen, Queues oder Hashtabellen. Diese Datenzugriffe erinnern an die Abfragekonstrukte von relationalen Datenbanken.</p>
<p>Mit SQL-ähnlichen Abfragen und Konstrukten lässt sich beispielsweise möglichst schnell und simultan nach einem bestimmten Namen suchen. Dies gilt zumindest für große Datensätze. Sind nämlich nur wenigen Daten vorhanden, entpuppt sich die Parallelisierung oft als kontraproduktiv, da der notwendige Overhead die Berechnung eher ausbremst als beschleunigt.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-743" style="margin: 5px 10px;" title="Mit der Methode AsParallel() können in großen Datensätze simultan nach bestimmten Daten gesucht werden" src="http://www.software-dev-blog.de/wp-content/images/2009/02/plinq_as_parallel.jpg" alt="Mit der Methode AsParallel() können in großen Datensätze simultan nach bestimmten Daten gesucht werden" width="500" /></p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-3/02/2009/&via=sw_devtwits&text= Multicore-Programmierung im .NET-Umfeld - Teil 3&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-3/02/2009/&via=sw_devtwits&text= Multicore-Programmierung im .NET-Umfeld - Teil 3&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-3/02/2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Multicore-Programmierung im .NET-Umfeld &#8211; Teil 2</title>
		<link>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/</link>
		<comments>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 15:37:43 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Event]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=713</guid>
		<description><![CDATA[Wie ich gestern versprochen habe, folgt heute der zweite Teil meines Mini-OOP-Specials zum Thema Multicore-Programmierung in der .NET-Welt. Im einleitenden Teil habt ihr unter anderem erfahren &#8230; &#8230; warum es mittlerweile mehr Anstrengungen erfordert, bestehende oder neue Anwendungen auf vorhandenen Computerplattformen schneller zu machen, &#8230; was die Gesetze von Amdahl und Gustafson für die parallele [...]]]></description>
			<content:encoded><![CDATA[<p>Wie ich <a title=" Multicore-Programmierung im .NET-Umfeld - Teil 1 " href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/">gestern versprochen habe</a>, folgt heute der zweite Teil meines Mini-OOP-Specials zum Thema Multicore-Programmierung in der .NET-Welt.</p>
<p>Im einleitenden Teil habt ihr unter anderem erfahren &#8230;</p>
<p>&#8230; warum es mittlerweile mehr Anstrengungen erfordert, bestehende oder neue Anwendungen auf vorhandenen Computerplattformen schneller zu machen,</p>
<p>&#8230; was die Gesetze von Amdahl und Gustafson für die parallele Programmierung bedeuten</p>
<p>&#8230; und auf welchen Elementen moderne Programmarchitekturen basieren.</p>
<p>Im heutigen zweiten Teil geht es ans Eingemachte: Welche Hürden sind bei der Multicore-Programmierung im .NET-Umfeld zu überwinden? Welche Tools gibt es bereits dafür? Und was kommt auf die Entwickler in den nächsten Monaten noch alles zu?</p>
<p>Die gute Nachricht: Multithreading wird mittlerweile von den nativen Programmiersprachen wie C++ und Fortran bestens unterstützt. Hierfür gibt es auch diverse Tools wie <a title="Mit Intel Threading Building Blocks parallel programmieren" href="../12-thesen-und-antithesen-zur-multicore-programmierung/01/mit-intel-threading-building-blocks-parallel-programmieren/12/2008/">Threading Building Blocks</a>, <a title="Fehler im Multithread-Code aufspüren: Thread Checker" href="../12-thesen-und-antithesen-zur-multicore-programmierung/01/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Thread Checker</a> und <a title="Infos zu OpenMP und Intel TBB" href="../multithreading-konzepte-openmp-apis-und-intel-tbb/11/2008/">OpenMP</a>, die Entwickler für die Parallelprogrammierung einsetzen können. In Sachen C#, Java und Python sieht es zwar (noch) nicht ganz so gut aus, aber es gibt bereits einige Methoden, Multithreading in .NET-Applikationen zu realisieren. Dabei handelt es sich um Konstrukte zum Erzeugen und Synchronisieren von Threads, aber auch zum Sperren von gemeinsamen Ressourcen (Speicher) und zum Verwalten von Threadpools.</p>
<p><span id="more-713"></span>Nichtsdestotrotz gibt es beim Multithreading diverse Probleme, mit denen sich Programmierer ohne die passende Unterstützung durch Tools oder das Framework herumschlagen müssen. Hierzu zählen unter anderem <a title="Von Deadlocks, Race Conditions und anderen Laufzeitfehlern" href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">Race-Conditions, Deadlocks</a> und ein inkonsistentes Sperren von gemeinsamen Ressourcen. Die Performance leidet ebenfalls unter unzureichendem oder falschem Multithreading. Dies betrifft zum Beispiel das übertriebene Sperren von gemeinsamen Speicherbereichen sowie die vernünftige Lastverteilung auf die vorhandenen Prozessoren. Stichwort automatische Skalierung von Anwendungen auf unterschiedlichen Plattformen.</p>
<p>Doch zurück zur guten Nachricht: Es gibt Methoden, um in .NET-Umgebungen Multicore-Anwendungen mit relativ wenig Aufwand zu schreiben. Das Zauberwort: ThreadPool-Klassen. Diese eignen sich vor allem für asynchrone Aufgaben, die mithilfe der BackgroundWorker-Klasse auf einen eigenen Thread, sprich Prozessorkern, ausgelagert werden können. Ein Beispiel hierfür ist die Benutzeroberfläche, die einem dedizierten Thread zugeordnet wird. Parallel dazu läuft das Programm weiter, ohne dass es zu Leistungseinbußen kommt.</p>
<p>So viel zur Gegenwart. Die Zukunft sieht aber noch viel mehr vor. Denn eines ist klar: An der Multithread-Programmierung werden .NET-Entwickler bald nicht mehr vorbeikommen. Aus diesem Grund wurde die <a title="Mehr Infos zur Parallelprogrammierung powered by Microsoft auf MSDN" href="http://msdn.microsoft.com/en-us/concurrency/default.aspx" target="_blank">Microsoft Parallel Computing Initiative</a> ins Leben gerufen, die ein klares Ziel verfolgt:</p>
<blockquote><p>Vereinfachte Entwicklung paralleler Programme auf der Microsoft Windows Plattform, die korrekt, effizient und wartbar sind, für alle Software-Entwickler.</p></blockquote>
<p>Daraus sollen drei Dinge resultieren:</p>
<ul>
<li>Software-Entwickler können .NET-Programme einfacher parallelisieren, um sich besser auf die eigentliche Problemlösung zu konzentrieren.</li>
</ul>
<ul>
<li>Die Effizienz und Skalierbarkeit paralleler Anwendungen kann gesteigert werden.</li>
</ul>
<ul>
<li>Der Entwurf und Test paralleler Programme wird vereinfacht.</li>
</ul>
<p>All diese Forderungen münden in den Parallel Extensions (auch PFX genannt), die in das .NET-Framework Version 4.0 implementiert sein werden. Die PFX-Erweiterung zeichnet sich durch folgenden Merkmale aus:</p>
<ul>
<li>Die Parallel Extensions stellen eine Bibliothek dar, erfordern also keine Modifikationen am jeweiligen Compiler.</li>
</ul>
<ul>
<li>Sie sind sehr &#8220;leichtgewichtig&#8221;, da sie im Benutzermodus laufen.</li>
</ul>
<ul>
<li> Es wird deklaratives und imperatives Parallelisieren unterstützt. Für die imperative <a title="Programmiermethoden: Daten- und Aufgabenparallelität" href="http://www.software-dev-blog.de/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/">Aufgabenparallelität</a> ist die Task Parallel Library zuständig, um die deklarative Datenparallelität kümmert sich <a title="Mehr Infos zu PLINQ" href="http://msdn.microsoft.com/de-de/magazine/cc163329.aspx" target="_blank">PLINQ</a>.</li>
</ul>
<ul>
<li>Es wird ein gemeinsames Exception-Handling-Modell geben, da die Ausnahmebehandlungen bei parallelen Programmen anders aussehen als bei seriellem Quellcode.</li>
</ul>
<p>Und was bringt das Ganze? Nun, PFX bietet eine überschaubare Anzahl von Konzepten und reduziert zudem die Komplexität paralleler Programmierung. Denn das erklärte Ziel ist es ja, Anwendungsprogrammierern den Zugang zur Multithreading-Entwicklung so einfach wie möglich zu machen. Für bessere parallelisierte Programme.</p>
<p><strong>Übrigens:</strong> Wer sich Visual Studio 2010 und das zugehörige .NET-Framework 4.0 schon mal ansehen will, kann sich auf eigene Gahr die <a title="VS 2010 und .NET 4.0 auf den PC laden" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&amp;displaylang=en" target="_blank">CTP-Version auf seinen Rechner laden</a>. Und wer noch mehr zum Thema paralleles Programmieren unter .NET wissen will, sollte <a title="Dritter Teil der Mini-Serie &quot;Multicore-Programmierung im .NET-Umfeld&quot;" href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-3/02/2009/">am Montag</a> hier wieder vorbeikommen &#8230;</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/&via=sw_devtwits&text= Multicore-Programmierung im .NET-Umfeld - Teil 2&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/&via=sw_devtwits&text= Multicore-Programmierung im .NET-Umfeld - Teil 2&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Multicore-Programmierung im .NET-Umfeld &#8211; Teil 1</title>
		<link>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/</link>
		<comments>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 16:03:04 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[Event]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=708</guid>
		<description><![CDATA[Gestern war ich auf der zweiten Multicore-Session der OOP 2009 (am Dienstag wohnte ich dem Vortrag von Professor Tichy der Uni Karlsruhe bei). Die Mittwoch-Veranstaltung trug den Titel &#8220;Programmierung für Multicore-CPUs&#8221;, die sich im Speziellen an .NET-Entwickler richtete. Warum Klaus Bode nicht auf native Programmiersprachen wie C++ eingegangen ist, erklärte er mir im Anschluss an [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern war ich auf der zweiten Multicore-Session der <a title="Mehr Infos zur OOP 2009" href="http://www.software-dev-blog.de/multicore-programmierung-auf-der-oop-2009/01/2009/">OOP 2009</a> (am Dienstag wohnte ich dem <a title=" 12 Thesen und Antithesen zur Multicore-Programmierung " href="http://www.software-dev-blog.de/12-thesen-und-antithesen-zur-multicore-programmierung/01/2009/">Vortrag von Professor Tichy</a> der Uni Karlsruhe bei). Die Mittwoch-Veranstaltung trug den Titel &#8220;Programmierung für Multicore-CPUs&#8221;, die sich im Speziellen an .NET-Entwickler richtete. Warum Klaus Bode nicht auf native Programmiersprachen wie C++ eingegangen ist, erklärte er mir im Anschluss an seinen Vortrag; das ist aber eine andere Geschichte.</p>
<p>Die Session gliederte sich in vier Abschnitte: Einleitung, Parallelisierung durch Multithreading, neue Konzepte in .NET 4.0 und Ausblick. Die Zusammenfassung verschweige ich einfach mal.</p>
<p>Der erste Teil <strong>&#8220;Einleitung&#8221;</strong> beschäftigte sich vor allem mit der Frage, warum das kostenlose Mittagessen vorbei ist. Dies ist die zugegebenermaßen schwachsinnige Übersetzung <a title="Der englischsprachige Artikel &quot;The free lunch is over&quot;" href="http://www.gotw.ca/publications/concurrency-ddj.htm" target="_blank">eines englischsprachigen Artikels</a>, der sich mit der Tatsache beschäftigt, dass Prozessoren seit Jahren nicht mehr schneller werden (sondern eher langsamer) und man daher als Entwickler keine Geschwindigkeitszuwächse mehr erwarten kann, die quasi kostenlos für mehr Leistung sorgen, ohne dass man hierfür am Quellcode herumschrauben muss. Das heißt dann im Umkehrschluss, dass sich Programmierer in Zukunft intensiv mit dem Thema Parallelprogrammierung <a title=" In der Parallelprogrammierung steckt die Zukunft" href="http://www.software-dev-blog.de/in-der-parallelprogrammierung-steckt-die-zukunft/01/2009/">auseinandersetzen</a> müssen, um aus den künftigen Multicore-Prozessoren das Optimum herauszuholen.</p>
<p>Um die möglichen Schwierigkeiten der Parallelprogrammierung zu verdeutlichen, wies Rohe zunächst auf die Architektur des Core 2 Duo Prozessors von Intel hin, der aus zwei Kernen mit einem eigenem L1-Cache besteht, aber zudem über einen gemeinsamen L2-Cache verfügt. Und genau das stellt eine der wesentlichen Herausforderungen der Parallelprogrammierung dar: der gemeinsame Speicherzugriff mit all seinen <a title="Von Deadlocks, Race Conditions und anderen Laufzeitfehlern" href="http://www.software-dev-blog.de/fehler-im-multithread-code-aufspuren-thread-checker/11/2008/">unvorhersehbaren Verklemmungen</a> und Problemen!</p>
<p><span id="more-708"></span>Über die Grenzen der Parallelisierung sprach Rohe natürlich auch, und zwar mithilfe des <a title="Wiki-Info zum Amdahlschen Gesetz" href="http://de.wikipedia.org/wiki/Amdahlsches_Gesetz" target="_blank">Amdahlschen Gesetzes</a>, das eher pessimistisch ausgelegt ist. Tenor von Amdahl, einem amerikanischen Computerarchitekten: Je höher der Anteil an sequenziellem Quellcode innerhalb einer Anwendung ist, desto weniger profitiert eine Anwendung von der Parallelisierung. Dies kann laut Amdahl so weit gehen, dass selbst eine große Zahl an Prozessorkernen keinen nennenswerten Geschwindigkeitszuwachs mit sich bringt &#8211; allen Parallelisierungsanstrengungen zum Trotz.</p>
<p>Aber es gibt auch <a title="Wiki-Infos zum Gesetz von Gustafson" href="http://en.wikipedia.org/wiki/Gustafson%27s_law" target="_blank">das Gesetz von Gustafson</a>, das viel optimistischer als das von Amdahl ausgelegt ist. Gustafson kam im Zuge seiner Studien zu dem Schluss, dass die Parallelisierung von der verfügbaren Zahl der Prozessorkerne abhängt. Ergo: Je mehr CPUs vorhanden sind, desto besser skaliert die parallelisierte Anwendung.</p>
<p>Seine Einleitung schloss Rohe mit der Unterscheidung von Agenten, <a title=" Programmiermethoden: Daten- und Aufgabenparallelität " href="http://www.software-dev-blog.de/programmiermethoden-daten-und-aufgabenparallelitat/12/2008/">Aufgaben und Daten</a>, auf denen jede Programmarchitektur basiert. Das Wissen um diese drei Programmpfeiler ist für das Verständnis der parallelen Programmierung von elementarer Wichtigkeit.</p>
<p><strong>Programmhinweis:</strong> Die Teile <a title="Zweiter Teil der Mini-Serie &quot;Multicore-Programmierung im .NET-Umfeld&quot;" href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-2/01/2009/">zwei</a> und <a title="Dritter Teil der Mini-Serie &quot;Multicore-Programmierung im .NET-Umfeld&quot;" href="http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-3/02/2009/">drei</a> sowie die Zusammenfassung gibt es morgen hier auf diesem Kanal. So, stay tuned. Am besten, ihr abonniert das Blog einfach als <a title="Das Software Dev Blog als RSS-Feed" href="http://www.it-techblog.de/feed/" target="_blank">RSS-Feed</a>. Oder lasst euch neue Beiträge via Feedburner in die Inbox eures Mailprogramms schicken.</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/&via=sw_devtwits&text=Multicore-Programmierung im .NET-Umfeld - Teil 1&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/&via=sw_devtwits&text=Multicore-Programmierung im .NET-Umfeld - Teil 1&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/multicore-programmierung-im-net-umfeld-teil-1/01/2009/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Wenn Hard- und Software verschmelzen: Virtualisierung</title>
		<link>http://www.software-dev-blog.de/wenn-hard-und-software-verschmelzen-virtualisierung/10/2008/</link>
		<comments>http://www.software-dev-blog.de/wenn-hard-und-software-verschmelzen-virtualisierung/10/2008/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 13:27:29 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Virtualisierung]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[Surftipp]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=44</guid>
		<description><![CDATA[Wichtig sind darüber hinaus einzelne Aspekte, mit denen sich Software-Entwickler beschäftigen sollten: Welche Virtualisierungsmodelle es gibt, wie sich virtuelle Anwendungen entwickeln lassen und was es mit der Intel VT für Netzwerk-Komponenten auf sich hat.Aber auch die technischen Online-Dokumente sollen Software-Entwicklern dabei helfen, das Thema Intel VT besser zu verstehen. Hierfür gibt es eigens eingerichtete Workshops, [...]]]></description>
			<content:encoded><![CDATA[<p>Wichtig sind darüber hinaus einzelne Aspekte, mit denen sich <a title="VT-Tipps für Entwickler" href="http://software.intel.com/en-us/articles/virtualization-for-developers" target="_blank">Software-Entwickler</a> beschäftigen sollten: Welche Virtualisierungsmodelle es gibt, wie sich virtuelle Anwendungen entwickeln lassen und was es mit der <a title="Intel VT für Netzwerk-Komponenten" href="http://software.intel.com/file/1920">Intel VT für Netzwerk-Komponenten</a> auf sich hat.Aber auch die <a title="Technische Online-Dokuemente zum Thema VT" href="http://software.intel.com/en-us/articles/technical-reference" target="_blank">technischen Online-Dokumente</a> sollen Software-Entwicklern dabei helfen, das Thema Intel VT besser zu verstehen. Hierfür gibt es eigens eingerichtete Workshops, die zeigen sollen, wie sich eine virtualisierte Umgebung mithilfe von VMWare-Lösungen <a title="Tutorial: VT-Rechner mithilfe von VMWare einrichten" href="http://software.intel.com/en-us/articles/creating-a-virtual-machine-on-vmware-tutorial" target="_blank">einrichten</a> lässt. Oder wie man I/O-Schnittstellen für virtualisierte Zugriffe optimieren kann.</p>
<p>Teil zwei unserer kleinen Vorstellungsrunde „Was findet hier eigentlich statt?“ beschäftigt sich mit dem Thema <a title="Wiki-Infos zu Virtualisierung" href="http://de.wikipedia.org/wiki/Virtualisierung_(Informatik)" target="_blank">Virtualisierung</a>. Dass es sich hierbei um einen Begriff handelt, der sehr unterschiedlich genutzt wird, macht es nicht wirklich leichter. Wir wollen aber trotzdem versuchen, uns dem Thema ein wenig anzunähern.<br />
Ein guter Start in die virtuelle Intel-Welt ist die Webseite <a title="Intel Virtualization Developer Community" href="http://software.intel.com/en-us/articles/intel-virtualization-developer-community" target="_blank">Intel Virtualization Developer Community</a>, auf der es eine Menge an nützlichen Infos zu entdecken gibt. Dazu gehören unter anderem <a title="Hintergrundinfos zur Virtualisierung" href="http://software.intel.com/en-us/articles/virtualization-basics" target="_blank">Hintergrundinformationen</a> rund um das Thema Virtualisierung: Warum Software-Entwickler die Virtualisierung ernst nehmen sollten, Vorteile der Virtualisierung in großen Unternehmen, Software-Design für virtualisierte Rechner und was hinter der <a title="Mehr Infos zur Intel VT" href="http://www.intel.com/technology/virtualization/index.htm" target="_blank">Intel Virtualization Technology</a> (Intel VT) steckt.</p>
<p><span id="more-44"></span>Was aber hilft die ganze Theorie, wenn die Praxis nicht zu Wort kommt. Daher darf natürlich nicht der Hinweis auf existierende <a title="Intel-US-Blogger berichten über das Thema Virtualisierung" href="http://software.intel.com/en-us/blogs/category/virtualization/" target="_blank">Blogs</a> und Foren fehlen, in denen Virtualisierungsexperten einerseits und Entwickler andererseits Tipps geben, über ihre Erfahrungen berichten und einfach nur helfen wollen. Außerdem gewähren beispielhafte <a title="Beispielshafte VT-Anwendungen" href="http://software.intel.com/en-us/articles/virtualization-usage-models" target="_blank">Anwendungen</a> tiefer gehende Einblicke in das Thema Virtualisierung.</p>
<p>Natürlich will und wird das Software Dev Blog all das ebenfalls leisten: Einblicke verschaffen, Antworten geben und die Community näher zusammenbringen. Wir freuen uns auf Ihre Teilnahme!</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/wenn-hard-und-software-verschmelzen-virtualisierung/10/2008/&via=sw_devtwits&text=Wenn Hard- und Software verschmelzen: Virtualisierung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/wenn-hard-und-software-verschmelzen-virtualisierung/10/2008/&via=sw_devtwits&text=Wenn Hard- und Software verschmelzen: Virtualisierung&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/wenn-hard-und-software-verschmelzen-virtualisierung/10/2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Von mobilen Spielen und 3D: Visual Computing</title>
		<link>http://www.software-dev-blog.de/von-mobilen-spielen-und-3d-visual-computing/10/2008/</link>
		<comments>http://www.software-dev-blog.de/von-mobilen-spielen-und-3d-visual-computing/10/2008/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 10:06:23 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Visual Computing]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[Inside]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=33</guid>
		<description><![CDATA[Gestern haben wir in groben Zügen die drei Bereiche skizziert, um die es in den nächsten Wochen und Monaten auf diesem Software Dev Blog gehen wird. Doch was zeichnet Visual Computing, Virtualisierung und Multicore Computing aus? Den Anfang macht Visual Computing. Hier geht es vor allem um eins: Spaß! Zumindest, wenn man sich in der [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern haben wir in groben Zügen die drei Bereiche skizziert, um die es in den nächsten Wochen und Monaten auf diesem Software Dev Blog gehen wird. Doch was zeichnet Visual Computing, Virtualisierung und Multicore Computing aus?</p>
<p>Den Anfang macht <a title="Visual Computing auf intel.com" href="http://www.intel.com/software/graphics/" target="_blank">Visual Computing</a>. Hier geht es vor allem um eins: Spaß! Zumindest, wenn man sich in der Gaming-Ecke aufhält und stets mit den neuen aufregenden Spieletiteln zu tun hat, mit denen sich Intel und deren Software-Partner (ISV = Independent Software Vendor) den ganzen Tag beschäftigen. Dabei lassen zwei große Trends erkennen: mobiles Gaming-Erlebnis und Multi-Threading.</p>
<p>3D-Spiele auf einer <a title="Wie ich aus einem 3D-Spiel eine mobile Anwendung mache" href="http://software.intel.com/en-us/blogs/2008/08/14/gcdc08-turn-your-game-into-a-real-mobile-app/" target="_blank">mobilen Plattform</a> sind laut <a title="Videointerview mit Heiko Tom Felde und dem Ascaron-Team bzgl. Sacred 2" href="http://software.intel.com/en-us/videos/ascarons-sacred-2-fallen-angel-on-intel-centrino2r-processor-technology-1" target="_blank">Heiko Tom Felde,</a> Managing Director von Ascaron, das nächste große Ding. Er muss es wissen, schließlich zeichnet sich seine Firma für das Adventure-RPG-Game <a title="Mehr Infos zu Sacred 2" href="http://www.sacred2.com/landingpage/index_de.html" target="_blank">Sacred 2</a> verantwortlich. Sacred 2 wurde als einer der ersten Spieletitel überhaupt für die <a title="Mehr Infos zur Centrino-2-Technik von Intel" href="http://www.it-techblog.de/centrino-2-prozessortechnik-von-intel-im-detail/07/2008/">Centrino-2-Plattform</a> von Intel optimiert und deren integrierte Grafikeinheit GMA X4500.</p>
<p><span id="more-33"></span>Damit läuft ein aufwendig gestaltetes RPG erstmals auf einem Notebook, da die notwendigen Berechnungen, das 3D-Rendering und andere relevante Komponenten auf die mobile Plattform zugeschnitten sind. Und dass Sacred 2 auf einem Montevina-Laptop gut aussieht, davon konnten wir uns auf der <a title="Blogbeiträge anlässlich der GCDC'08 in Leipzig" href="http://softwareblogs.intel.com/2008/08/16/gcdc08-leipzig-we-are-coming/" target="_blank">GCDC’08</a> <a title="Erste Bewegtbilder von Sacred 2 live von der GCDC'08" href="http://software.intel.com/en-us/blogs/2008/08/18/gcdc08-optimized-games-on-intel-platform/" target="_blank">selbst überzeugen</a> &#8211; wir waren ziemlich begeistert.</p>
<p>Das Thema <a title="Mehr Leistung durch Multi-Threading von Anwendungen" href="http://software.intel.com/en-us/blogs/2008/08/12/gcdc08-get-the-best-out-of-your-gaming-titles/" target="_blank">Multi-Threading</a> ist ebenfalls ein wichtiges Thema bei den Jungs und Mädels der Visual Computing Group. Oder anders ausgedrückt: Wie optimiere ich meinen <a title="Videocast: Leigh Davies von Intel spricht über DirectX-Optimierung" href="http://software.intel.com/en-us/blogs/2008/08/19/gcdc08-optimizing-directx-code-for-multi-core-platforms/" target="_blank">DirectX</a>- und OpenGL-basierten Content so gut wie möglich für Intel-Prozessoren und wie gelingt es mir, Highend-Anwendungen wie <a title="Videocast: Live-Demo von Autodesk von der Siggraph 2008" href="http://software.intel.com/en-us/videos/autodesk-in-intel-siggraph-booth" target="_blank">Autodesk</a> oder eine <a title="Mehr Infos zu Echtzeitsimulationen auf Intel-Plattformen" href="http://software.intel.com/en-us/articles/real-time-deep-ocean-simulation-on-multi-threaded-architectures" target="_blank">Echtzeit-Simulation der Meere</a> für eine Vielzahl von Prozessoren zu parallelisieren?</p>
<p>Das Beste daran aber ist die Tatsache, dass man als unabhängiger Entwickler vor diesen Herausforderungen nicht allein steht. Dank des <a title="Mehr Infos und Anmeldung zum Software Partner Program" href="http://www.intel.com/software/partner/visualcomputing/" target="_blank">Software Partner Programms</a> (SPP) kann man nämlich von Intels Expertise profitieren, indem man sich dem SPP anschließt und so eine bestmögliche Unterstützung erfährt. Und wer sich beeilt und dem SPP noch im Oktober beitritt, kann ein tragbares Solarladegerät gewinnen. Wenn das kein weiterer Anreiz ist &#8230;</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/von-mobilen-spielen-und-3d-visual-computing/10/2008/&via=sw_devtwits&text=Von mobilen Spielen und 3D: Visual Computing&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/von-mobilen-spielen-und-3d-visual-computing/10/2008/&via=sw_devtwits&text=Von mobilen Spielen und 3D: Visual Computing&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/von-mobilen-spielen-und-3d-visual-computing/10/2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3D, Multicore und Virtualisierung: Software Dev Blog</title>
		<link>http://www.software-dev-blog.de/3d-multicore-und-virtualisierung-software-dev-blog/10/2008/</link>
		<comments>http://www.software-dev-blog.de/3d-multicore-und-virtualisierung-software-dev-blog/10/2008/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 12:57:04 +0000</pubDate>
		<dc:creator>Michael Hülskötter</dc:creator>
				<category><![CDATA[Multicore]]></category>
		<category><![CDATA[Virtualisierung]]></category>
		<category><![CDATA[Visual Computing]]></category>
		<category><![CDATA[Basics]]></category>
		<category><![CDATA[Inside]]></category>

		<guid isPermaLink="false">http://www.software-dev-blog.de/?p=27</guid>
		<description><![CDATA[Das Software Dev Blog befasst sich wie bereits angedeutet vornehmlich mit drei Themenbereichen: Visual Computing, Multicore Computing und Virtualisierung. Die Sektion Visual Computing beschäftigt sich mit allem, in dem das Kürzel „3D“ vorkommt. Klar! Bevorzugt also mit 3D-Spielen, aber natürlich auch mit Animations-Software wie Maya oder Architektenanwendungen wie AutoCAD. Dass in diesem Bereich insgesamt eine [...]]]></description>
			<content:encoded><![CDATA[<p>Das Software Dev Blog befasst sich wie bereits angedeutet vornehmlich mit drei Themenbereichen: Visual Computing, Multicore Computing und Virtualisierung.</p>
<p>Die Sektion <a title="Visual Computing auf intel.com" href="http://www.intel.com/software/graphics/">Visual Computing</a> beschäftigt sich mit allem, in dem das Kürzel „3D“ vorkommt. Klar! Bevorzugt also mit 3D-Spielen, aber natürlich auch mit Animations-Software wie Maya oder Architektenanwendungen wie AutoCAD. Dass in diesem Bereich insgesamt eine Menge Optimierungspotenzial steckt, davon konnten wir uns im August selbst ein Bild machen. Ich sage nur: <a title="Vorab-Demo von Sacred 2 live von der GCDC'08 aus Leipzig" href="http://software.intel.com/en-us/blogs/2008/08/18/gcdc08-optimized-games-on-intel-platform/" target="_blank">Sacred 2</a>, das dank der Optimierungskünste von Ascaron (und mithilfe von Intel) sogar auf einem Notebook mit integrierter Intel-Grafik flüssig läuft.</p>
<p>Das Thema <a title="Multicore-Webseite auf intel.com" href="http://www.intel.com/software/mcdeveloper">Multicore</a> hat ebenfalls viel mit optimiertem Programmcode zu tun: An welchen Schrauben muss ich drehen, damit meine Anwendung nicht nur auf einem Dual 2 Core eine angemessene Leistung bringt, sondern auch auf vier oder acht Prozessorkernen. Hierzu findet man auf der Multicore-Seite ganz viele Tipps &amp; Tricks, aber auch Links zu nützlichen Tools und anderen Ressourcen. Sehr cool ist auch das BlogTalkRadio auf der Multicore-Seite. All diese Dinge wird es natürlich Stück für Stück auch auf dem Software Dev Blog geben.</p>
<p><span id="more-27"></span>Last but not least wird der Software Dev Blog vom immer wichtiger werdenden Thema <a title="Webseite zum Thema Virtualisierung auf intel.com" href="http://www.intel.com/software/virtualization/" target="_blank">Virtualisierung</a> handeln. Hierzu findet man auf der US-amerikanischen Seite ebenfalls eine Menge an nützlichen Links: Was ist Virtualisierung, wie setze ich diese sinnvoll ein, welche Tools gibt es hierfür und was hat das alles mit Intel zu tun.</p>
<p>Sie sehen also, hier wird sich einiges tun in den nächsten Wochen und Monaten. Und wir haben nicht nur die pure Theorie im Visier: Natürlich sollen auch Entwickler zu Wort kommen, die gute Erfahrungen mit Intel in Sachen Developer-Support gemacht haben. Oder wir werden aussagekräftige Beispiele zu Rate ziehen, die das Optimierungspotenzial  komplexer Software am besten demonstrieren. Oder …</p>
<p>Vielleicht fällt Ihnen ja ein weiteres „oder“ ein, das Sie gerne mit uns und allen Anwesenden dieses Blogs teilen wollen. <a title="Ersetzen Sie AT und DOT durch die entsprechenden Zeichen" href="mailto:info (AT) software-dev-blog (DOT) de">Mailen</a> Sie uns oder nutzen Sie die Kommentarfunktion. Wir freuen uns darauf!</p>
<p><strong>BTW:</strong> Vom 10. bis 13. November werden wir live und in Farbe von der großen Microsoft-Entwicklerkonferenz <a title="Mehr Infos zur Microsoft Tech-Ed EMEA 2008" href="http://www.microsoft.com/emea/teched2008/developer/default.aspx" target="_blank">Tech-Ed EMEA 2008</a> berichten. Lassen Sie sich überraschen &#8230;</p>
<div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/3d-multicore-und-virtualisierung-software-dev-blog/10/2008/&via=sw_devtwits&text=3D, Multicore und Virtualisierung: Software Dev Blog&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div style="float: left margin-left: 30px; margin-buttom: 20px"><a href="http://twitter.com/share?url=http://www.software-dev-blog.de/3d-multicore-und-virtualisierung-software-dev-blog/10/2008/&via=sw_devtwits&text=3D, Multicore und Virtualisierung: Software Dev Blog&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.software-dev-blog.de/3d-multicore-und-virtualisierung-software-dev-blog/10/2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

