<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Threadsicherheit (mit OpenMP)]]></title><description><![CDATA[<p>Hi,</p>
<p>(kurze Nebenbemerkung vorab: ich bin mir nicht ganz sicher, in welchem Forum dieser Post am besten aufgehoben ist, ggf. also bitte verschieben.)</p>
<p>Jetzt zum eigentlichen Problem. Ich habe ein bisschen mit der Parallelisierung einer Berechnung (mit OpenMP) experimentiert und würde gerne noch einmal sicherstellen, in welchen Fällen Zugriffsprobleme auftreten können. Hier ein paar Beispiele, um die es mir geht:</p>
<p>1.) Initialisierung (oder auch Zuweisung) einer gemeinsam genutzten Variablen</p>
<pre><code class="language-cpp">MyObj global;
{ // start paralleler Block
    MyObj aObj(global);
    // bzw.
    MyObj* pObj = new MyObj(global);
} // ende paralleler Block
</code></pre>
<p>2.) Aufruf einer Methode einer gemeinsam genutzten Variablen</p>
<pre><code class="language-cpp">class MyObj
{
    //...
    // Fall a)
    void DoSomething() const;
    // Fall b)
    void DoSomething();
}

MyObj global;
{ // start paralleler Block
    global.DoSomething();
} // ende paralleler Block
</code></pre>
<p>3.) Aufruf einer Funktion, die eine gemeinsam genutzte Variable übergeben bekommt</p>
<pre><code class="language-cpp">void DoSomethingWith(const MyObj&amp;)
{
    // do something with MyObj
}
MyObj global;
{ // start paralleler Block
    DoSomethingWith(global); 
} // ende paralleler Block
</code></pre>
<p>Mir geht es also darum, in welchen Fällen ich &quot;global&quot; schützen muss, d.h. in welchen Fällen die beschriebenen Operationen beispielsweise in einer &quot;Critical Section&quot; erfolgen müssen.<br />
Persönlich denke ich, dass nur 1.) in Ordnung ist und dass bei 2.) und 3.) Probleme entstehen können, ich wäre aber dankbar, wenn mir das hier nochmal jemand bestätigen bzw. mich korrigieren könnte.</p>
<p>Vielen Dank schonmal vorab!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235425/threadsicherheit-mit-openmp</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 16:50:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235425.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Mar 2009 09:37:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Mon, 02 Mar 2009 09:37:02 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>(kurze Nebenbemerkung vorab: ich bin mir nicht ganz sicher, in welchem Forum dieser Post am besten aufgehoben ist, ggf. also bitte verschieben.)</p>
<p>Jetzt zum eigentlichen Problem. Ich habe ein bisschen mit der Parallelisierung einer Berechnung (mit OpenMP) experimentiert und würde gerne noch einmal sicherstellen, in welchen Fällen Zugriffsprobleme auftreten können. Hier ein paar Beispiele, um die es mir geht:</p>
<p>1.) Initialisierung (oder auch Zuweisung) einer gemeinsam genutzten Variablen</p>
<pre><code class="language-cpp">MyObj global;
{ // start paralleler Block
    MyObj aObj(global);
    // bzw.
    MyObj* pObj = new MyObj(global);
} // ende paralleler Block
</code></pre>
<p>2.) Aufruf einer Methode einer gemeinsam genutzten Variablen</p>
<pre><code class="language-cpp">class MyObj
{
    //...
    // Fall a)
    void DoSomething() const;
    // Fall b)
    void DoSomething();
}

MyObj global;
{ // start paralleler Block
    global.DoSomething();
} // ende paralleler Block
</code></pre>
<p>3.) Aufruf einer Funktion, die eine gemeinsam genutzte Variable übergeben bekommt</p>
<pre><code class="language-cpp">void DoSomethingWith(const MyObj&amp;)
{
    // do something with MyObj
}
MyObj global;
{ // start paralleler Block
    DoSomethingWith(global); 
} // ende paralleler Block
</code></pre>
<p>Mir geht es also darum, in welchen Fällen ich &quot;global&quot; schützen muss, d.h. in welchen Fällen die beschriebenen Operationen beispielsweise in einer &quot;Critical Section&quot; erfolgen müssen.<br />
Persönlich denke ich, dass nur 1.) in Ordnung ist und dass bei 2.) und 3.) Probleme entstehen können, ich wäre aber dankbar, wenn mir das hier nochmal jemand bestätigen bzw. mich korrigieren könnte.</p>
<p>Vielen Dank schonmal vorab!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1672689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1672689</guid><dc:creator><![CDATA[ThreadSafety]]></dc:creator><pubDate>Mon, 02 Mar 2009 09:37:02 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Fri, 15 May 2009 15:44:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vor gut zwei Monaten habe ich hier die obige Frage gestellt. Um auf Nummer sicher zu gehen habe ich damals vorsichtshalber lieber eine Variable zu viel als zu wenig geschützt. Wenn es sich um Objekte handelt, die ein wenig mehr Speicher benötigen, ist das aber unter Umständen keine so gute Lösung.</p>
<p>Ich hole deshalb den Thread einfach nochmal hoch und hoffe, dass mir vielleicht diesmal jemand ein paar Hinweise geben kann.</p>
<p>Besten Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711098</guid><dc:creator><![CDATA[ThreadSafety]]></dc:creator><pubDate>Fri, 15 May 2009 15:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Fri, 15 May 2009 16:19:54 GMT]]></title><description><![CDATA[<p>Die Fragen kann man sich doch alle selber beantworten, wenn man einfach mal ein Beispiel Schritt für Schritt durchgeht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711130</guid><dc:creator><![CDATA[mal ehrlich]]></dc:creator><pubDate>Fri, 15 May 2009 16:19:54 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Fri, 15 May 2009 18:14:11 GMT]]></title><description><![CDATA[<p>Solange man nichts genaueres über die &quot;MyObj&quot; Klasse und deren Memberfunktionen weiss, kann man nur sagen: du musst bei jedem Zugriff auf MyObj (egal ob &quot;const&quot; oder nicht &quot;const&quot;) einen unique-lock auf eine Mutex holen!</p>
<p>Sollten gewisse Voraussetzungen erfüllt sein, dann reicht es, wenn du beim Lesen einen shared-lock holst. Locken musst du aber auf jeden Fall auch beim Lesen!</p>
<p>Also nochmal ganz klar: du musst bei 1, 2 UND 3 den Zugriff synchronisieren!<br />
Ja, auch bei 1!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711202</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 15 May 2009 18:14:11 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Fri, 15 May 2009 18:16:32 GMT]]></title><description><![CDATA[<p>mal ehrlich schrieb:</p>
<blockquote>
<p>Die Fragen kann man sich doch alle selber beantworten, wenn man einfach mal ein Beispiel Schritt für Schritt durchgeht.</p>
</blockquote>
<p>So ein Schwachsinn!</p>
<p>Dass viele Leute so wie du denken, gleichzeitig aber leider zu wenig Ahnung von Threading haben (die ich dir auch abspreche, sonst wüsstest du dass das Thema lange nicht so einfach ist), ist der Grund, warum so irre viele Leute andauernd Threading-bezogene Fehler machen.</p>
<p>Bla-Blubb.</p>
<p>Viel Spass beim schlechte Programme schreiben noch weiterhin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711203</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 15 May 2009 18:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Fri, 15 May 2009 22:31:01 GMT]]></title><description><![CDATA[<p>Ich würd mal gern wissen, wie so ein Konflikt überhaupt auftreten kann? Wenn 2 Threads aber nur wechselwirkend (da nur 1 Prozessor!) auf diesselbe Variable schreiben wollen? Entweder schreibt der eine Thread oder der andere. Aufm Stack passt doch nur ein Pointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711289</guid><dc:creator><![CDATA[xBlackKnightx]]></dc:creator><pubDate>Fri, 15 May 2009 22:31:01 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Fri, 15 May 2009 23:23:35 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3274">@xBlackKnightx</a>:<br />
Wie kommst du auf die Idee dass nur ein Thread gleichzeitig laufen würde??? Ich hab nen Quad-Core (auch &quot;nur 1 Prozessor&quot;), da laufen hübsch 4 Threads gleichzeitig.</p>
<p>Mal ganz davon abgesehen, dass es selbst bei &quot;nur ein Prozessor und auch nur ein Core (und auch kein Hyper-Threading etc.)&quot; Probleme geben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711297</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 15 May 2009 23:23:35 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Sat, 16 May 2009 04:19:38 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>mal ehrlich schrieb:</p>
<blockquote>
<p>Die Fragen kann man sich doch alle selber beantworten, wenn man einfach mal ein Beispiel Schritt für Schritt durchgeht.</p>
</blockquote>
<p>So ein Schwachsinn!</p>
<p>Dass viele Leute so wie du denken, gleichzeitig aber leider zu wenig Ahnung von Threading haben (die ich dir auch abspreche, sonst wüsstest du dass das Thema lange nicht so einfach ist), ist der Grund, warum so irre viele Leute andauernd Threading-bezogene Fehler machen.</p>
<p>Bla-Blubb.</p>
<p>Viel Spass beim schlechte Programme schreiben noch weiterhin.</p>
</blockquote>
<p>Dann unterstell ich dir jetzt mal, dass du dumm bist, wenn das hier schon kompliziert für dich ist. Jetzt sag mir doch mal bitte bei welchem dieser 3 einfachen Beispiele man nicht selber drauf kommen kann, was schief gehen kann, wenn er es genauer beschrieben hätte, so dass man es Schritt für Schritt durchgehen kann? Das was du hier machst sie doch nur dummes raten, weil die Beschreibung viel zu ungenau ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711312</guid><dc:creator><![CDATA[mal ehrlich]]></dc:creator><pubDate>Sat, 16 May 2009 04:19:38 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Sat, 16 May 2009 07:48:13 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3274">@xBlackKnightx</a>:<br />
Wie kommst du auf die Idee dass nur ein Thread gleichzeitig laufen würde??? Ich hab nen Quad-Core (auch &quot;nur 1 Prozessor&quot;), da laufen hübsch 4 Threads gleichzeitig.</p>
<p>Mal ganz davon abgesehen, dass es selbst bei &quot;nur ein Prozessor und auch nur ein Core (und auch kein Hyper-Threading etc.)&quot; Probleme geben kann.</p>
</blockquote>
<p>Hmm also die Prozesse werden im Prozessor verteilt? Würde ein Programm auch schneller laufen wenn man Skripte, Funktionen in Threads verteilt? Also bei 1-Prozessor PC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711328</guid><dc:creator><![CDATA[xBlackKnightx]]></dc:creator><pubDate>Sat, 16 May 2009 07:48:13 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Sat, 16 May 2009 09:19:06 GMT]]></title><description><![CDATA[<p>ThreadSafety schrieb:</p>
<blockquote>
<p>1.) Initialisierung (oder auch Zuweisung) einer gemeinsam genutzten Variablen</p>
<pre><code class="language-cpp">MyObj global;
{ // start paralleler Block
    MyObj aObj(global);
    // bzw.
    MyObj* pObj = new MyObj(global);
} // ende paralleler Block
</code></pre>
</blockquote>
<p>Du erstellst doch fuer jeden Thread eine eigene Kopie von global. Sollte der MyObj-Ctor keine Schreibzugriffe irgendeiner Art (siehe Fall 2) enthalten, muesste das okay sein.<br />
Aber wenn du im parallelen Block auf global zugreifst, muss dieser Zugriff geschuetzt werden!</p>
<blockquote>
<p>2.) Aufruf einer Methode einer gemeinsam genutzten Variablen</p>
<pre><code class="language-cpp">class MyObj
{
    //...
    // Fall a)
    void DoSomething() const;
    // Fall b)
    void DoSomething();
}

MyObj global;
{ // start paralleler Block
    global.DoSomething();
} // ende paralleler Block
</code></pre>
</blockquote>
<p>die const-Methode musst du nicht schuetzen, wenn diese wirklcih keine Zustaende schreibt. Aber wenn MyObj mutable-Variablen hat, DoSomething eine globale Funktion aufruft/auf globale Variablen zugreift, Dateizugriffe hat etc. etc. musst du auch hier synchronisieren.<br />
Ebenfalls synchronisieren musst du, wenn es einen anderen Thread gibt, der gleichzeitig ausgefuehrt wird und dieser irgendwie global veraendert.<br />
Die nicht-const-Methode - welche vermutlich irgend eine Schreib-Operation enthaelt - muss sowieso synchronisiert werden.</p>
<blockquote>
<p>3.) Aufruf einer Funktion, die eine gemeinsam genutzte Variable übergeben bekommt</p>
<pre><code class="language-cpp">void DoSomethingWith(const MyObj&amp;)
{
    // do something with MyObj
}
MyObj global;
{ // start paralleler Block
    DoSomethingWith(global); 
} // ende paralleler Block
</code></pre>
</blockquote>
<p>Wenn DoSomethingWith irgend einen Status schreibt (s.o.) musst du synchronisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711349</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Sat, 16 May 2009 09:19:06 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Sat, 16 May 2009 13:02:36 GMT]]></title><description><![CDATA[<p>Danke für die Antworten!</p>
<p>Ich gebe zu, dass meine Beispiele für konkrete Antworten eigentlich zu allgemein sind. Die Antworten haben trotzdem geholfen, dass mir die Sache ein wenig klarer geworden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711419</guid><dc:creator><![CDATA[ThreadSafety]]></dc:creator><pubDate>Sat, 16 May 2009 13:02:36 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Sat, 16 May 2009 15:14:08 GMT]]></title><description><![CDATA[<p>mal ehrlich schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>mal ehrlich schrieb:</p>
<blockquote>
<p>Die Fragen kann man sich doch alle selber beantworten, wenn man einfach mal ein Beispiel Schritt für Schritt durchgeht.</p>
</blockquote>
<p>So ein Schwachsinn!</p>
<p>Dass viele Leute so wie du denken, gleichzeitig aber leider zu wenig Ahnung von Threading haben (die ich dir auch abspreche, sonst wüsstest du dass das Thema lange nicht so einfach ist), ist der Grund, warum so irre viele Leute andauernd Threading-bezogene Fehler machen.</p>
<p>Bla-Blubb.</p>
<p>Viel Spass beim schlechte Programme schreiben noch weiterhin.</p>
</blockquote>
<p>Dann unterstell ich dir jetzt mal, dass du dumm bist, wenn das hier schon kompliziert für dich ist. Jetzt sag mir doch mal bitte bei welchem dieser 3 einfachen Beispiele man nicht selber drauf kommen kann, was schief gehen kann, wenn er es genauer beschrieben hätte, so dass man es Schritt für Schritt durchgehen kann? Das was du hier machst sie doch nur dummes raten, weil die Beschreibung viel zu ungenau ist.</p>
</blockquote>
<p>Aha.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711497</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 16 May 2009 15:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Threadsicherheit (mit OpenMP) on Sat, 16 May 2009 15:30:56 GMT]]></title><description><![CDATA[<p>xBlackKnightx schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3274">@xBlackKnightx</a>:<br />
Wie kommst du auf die Idee dass nur ein Thread gleichzeitig laufen würde??? Ich hab nen Quad-Core (auch &quot;nur 1 Prozessor&quot;), da laufen hübsch 4 Threads gleichzeitig.</p>
<p>Mal ganz davon abgesehen, dass es selbst bei &quot;nur ein Prozessor und auch nur ein Core (und auch kein Hyper-Threading etc.)&quot; Probleme geben kann.</p>
</blockquote>
<p>Hmm also die Prozesse werden im Prozessor verteilt? Würde ein Programm auch schneller laufen wenn man Skripte, Funktionen in Threads verteilt? Also bei 1-Prozessor PC</p>
</blockquote>
<p>Was hat denn schneller laufen mit Korrektheit und Thread-Safety zu tun?</p>
<p>Und was meinst du jetzt mit &quot;1-Prozessor PC&quot;? Single-Core, oder Single-CPU? Auf Single-CPU, Multi-Core Systemen bringt das was, ja.</p>
<p>Auf Single-CPU, Single-Core Systemen bringt es u.U. auch was, z.B. wenn die Skripte oder Funktionen IO machen, und dadurch auf etwas warten müssen, während die CPU Däumchen dreht.</p>
<p>Bezüglich deiner &quot;bloss eine Variable&quot; Frage, lies mal das, da werden einige der Probleme angesprochen:<br />
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1680.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1680.pdf</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1711505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1711505</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 16 May 2009 15:30:56 GMT</pubDate></item></channel></rss>