<?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[C++ und out-of-order execution]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>gegenben sei folgendes Code-Snippet:</p>
<pre><code class="language-cpp">// 
MyClass::setValue(int newValue)
{
  // yourMutexType mutex;
  // boost::mutex, QMutex als Beispiel
  mutex.lock();
  mValue = newValue;
  mutex.unlock();
}
</code></pre>
<p>Ist dann das Setzen von mValue dann wirklich in allen Fällen auf einen x86er threadsafe ?<br />
Prinzipiell darf der Compiler doch die Write-Back Reihenfolge umsortieren (siehe Topic).</p>
<p>Bitte keine sinnlosen Diskussionen über <strong>volatile</strong> starten.<br />
Ich gehe übrigens davon aus, dass mutex keinen impliziten Memory Barrier hat und CPU Architektur ist x86 (cache-cohärent).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290217/c-und-out-of-order-execution</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 16:56:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290217.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Jul 2011 14:48:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ und out-of-order execution on Thu, 21 Jul 2011 14:48:50 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>gegenben sei folgendes Code-Snippet:</p>
<pre><code class="language-cpp">// 
MyClass::setValue(int newValue)
{
  // yourMutexType mutex;
  // boost::mutex, QMutex als Beispiel
  mutex.lock();
  mValue = newValue;
  mutex.unlock();
}
</code></pre>
<p>Ist dann das Setzen von mValue dann wirklich in allen Fällen auf einen x86er threadsafe ?<br />
Prinzipiell darf der Compiler doch die Write-Back Reihenfolge umsortieren (siehe Topic).</p>
<p>Bitte keine sinnlosen Diskussionen über <strong>volatile</strong> starten.<br />
Ich gehe übrigens davon aus, dass mutex keinen impliziten Memory Barrier hat und CPU Architektur ist x86 (cache-cohärent).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096130</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Thu, 21 Jul 2011 14:48:50 GMT</pubDate></item><item><title><![CDATA[Reply to C++ und out-of-order execution on Thu, 21 Jul 2011 14:58:57 GMT]]></title><description><![CDATA[<p>Angenommen, es waere nicht threadsafe, welchen Sinn macht dann <code>mutex</code> bzw. deine verwendete Bibliothek?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096136</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 21 Jul 2011 14:58:57 GMT</pubDate></item><item><title><![CDATA[Reply to C++ und out-of-order execution on Thu, 21 Jul 2011 15:14:01 GMT]]></title><description><![CDATA[<p>In der abstrakten Maschine erfolgt die Zuweisung nach dem Lock und vor dem Unlock (schon allein deshalb, weil das Semikolon jeweils einen Sequenzpunkt darstellt).<br />
Der Compiler darf Reihenfolgen verändern, sofern das die Semantik des Programmes nicht verändert (aus Sicht eines einzelnen Threads). Das wäre also nur dann möglich, wenn weder Lock noch Unlock eine Abhängigkeit bzgl. mValue haben. Dieses Fehlen der Abhängkeit kann der Compiler im Prinzip nur dann beweisen, wenn er den Code dieser Funktionen kennt. Jede brauchbare Threading-Bibliothek ist allerdings so geschrieben, dass genau das nicht der Fall ist, die Funktionen also opaque sind. Ist auf diese Weise eine Umordnung durch den Compiler ausgeschlossen, genügt die Bedingung von sequentieller Cache-Kohärenz auch ohne explizite Barriers, sofern jeder Zugriff auf mValue von entsprechenden Locks umgeben ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096144</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 21 Jul 2011 15:14:01 GMT</pubDate></item><item><title><![CDATA[Reply to C++ und out-of-order execution on Thu, 21 Jul 2011 15:22:19 GMT]]></title><description><![CDATA[<p>Okay, die Antwort geht in die Richtung die ich wissen wollte.</p>
<p>Allerdings sollte in meiner threading-bibliothek doch explizit das Opaque-Verhalten in der Doku erwähnt sein, oder nicht ?<br />
Bei QT finde ich in der Doku von QMutex beispielsweise nichts darüber, aber beim QAtomicInt kann ich mir die Art der Memory Order auswählen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096151</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Thu, 21 Jul 2011 15:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to C++ und out-of-order execution on Thu, 21 Jul 2011 20:56:10 GMT]]></title><description><![CDATA[<p>Also ich glaube, so etwas Gravierendes wäre bereits aufgefallen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2096254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2096254</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 21 Jul 2011 20:56:10 GMT</pubDate></item></channel></rss>