<?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[Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;?]]></title><description><![CDATA[<p>Siehe Titel.<br />
Ich habe das schon öfters gesehen, hab aber nie verstanden, was es bewirkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/140425/was-bewirkt-das-schlüsselwot-quot-volatile-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 03:22:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/140425.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Mar 2006 19:19:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Tue, 14 Mar 2006 19:19:41 GMT]]></title><description><![CDATA[<p>Siehe Titel.<br />
Ich habe das schon öfters gesehen, hab aber nie verstanden, was es bewirkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016280</guid><dc:creator><![CDATA[voli]]></dc:creator><pubDate>Tue, 14 Mar 2006 19:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Tue, 14 Mar 2006 19:25:25 GMT]]></title><description><![CDATA[<p>volatile sagt dem compiler, dass eine variable sich jederzeit ändern kann(threads usw), er wird diese variable also net rausoptimieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016285</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 14 Mar 2006 19:25:25 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Tue, 14 Mar 2006 19:32:30 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>volatile sagt dem compiler, dass eine variable sich jederzeit ändern kann(threads usw), er wird diese variable also net rausoptimieren.</p>
</blockquote>
<p>Ach deswegen wird es bei inline assembly benutzt! Jetzt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016292</guid><dc:creator><![CDATA[voli]]></dc:creator><pubDate>Tue, 14 Mar 2006 19:32:30 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Tue, 14 Mar 2006 21:12:25 GMT]]></title><description><![CDATA[<p>voli schrieb:</p>
<blockquote>
<p>otze schrieb:</p>
<blockquote>
<p>volatile sagt dem compiler, dass eine variable sich jederzeit ändern kann(threads usw), er wird diese variable also net rausoptimieren.</p>
</blockquote>
<p>Ach deswegen wird es bei inline assembly benutzt! Jetzt!</p>
</blockquote>
<p>volatile ist weitgehend nutzlos wenn es um threads geht - und im zusammenhang mit inline-assembler (ich nehme an es bezieht sich auf gcc) hat es auch eine etwas andere bedeutung.</p>
<p>volatile sorgt dafür, dass alle lese- und schreiboperation auf allen volatile deklarierten variablen in genau der reihenfolge geschehen, in der sie dem programmablauf nach vorgeshen sind. lese- und schreiboperation auf volatiles ind beobachbares verhalten und setzen somit die as-if regel, die dem compiler sonst viele freiräume einräumt, diesbezgl. ausser kraft. beispiel:</p>
<pre><code class="language-cpp">int* p = get_ptr();
*p = 1;
*p = 2;
*p = 3;
</code></pre>
<p>der compiler darf daraus</p>
<pre><code class="language-cpp">int* p = get_ptr();
*p = 3;
</code></pre>
<p>machen. dagegen bewirkt</p>
<pre><code class="language-cpp">volatile int* p = get_ptr();
*p = 1;
*p = 2;
*p = 3;
</code></pre>
<p>dass tatsächlich genau 3 schreiboperationen über diesen pointer ausgeführt werden. das ist z.b. sehr zweckmässig, wenn man mit memory-mapped IO zu tun hat. für thread synchronisation ist volatile dagegen weitestgehend nutzlos, was dort gebraucht wird, sind memory barriers - wollte man dafür volatile einsetzen, müsste alles und jede entität volatile sein - das ist naturgemäss inakzeptabel. das problem hier ist die as-if regel: volatile ordnet nur zugriffe auf volatiles, alles andere dagegen bleibt ungeordnet bzgl. operationen auf volatiles (typisch: double-checked locking).</p>
<p>im zusammenhang mit asm blöcken soll es das umordnen des blockes bzgl. des umgebenden codes verhindern - das ist aber nicht 100% zuverlässig. will man sicher gehen, benötigt man einen eintrag &quot;memory&quot; in der clobber-liste. in diesem falle funktioniert der asm block als barriere (und den enstprechenden assembler code vorausgesetzt kann man damit dann memory berriers bauen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016364</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:12:25 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Tue, 14 Mar 2006 21:22:40 GMT]]></title><description><![CDATA[<p>Dieser Beitrag von camper ist IMHO einen FAQ Eintrag wert, speziell da es das Thema volatile dort scheinbar noch nicht gibt (jedenfalls laut Forensuche) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016371</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:22:40 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Tue, 14 Mar 2006 21:35:56 GMT]]></title><description><![CDATA[<blockquote>
<p>für thread synchronisation ist volatile dagegen weitestgehend nutzlos</p>
</blockquote>
<p>richtig. ist aber auch nicht das, was ich gesagt hab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>ich meinte speziell wenn ein thread ein objekt beliebig ändern kann. Der Compiler kann dies oft nicht wissen, und kann anfangen an dem objekt rumzuoptimieren. Speziell in verbindung mit const kann das ohne volatile probleme geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016374</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:35:56 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Tue, 14 Mar 2006 21:37:02 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<blockquote>
<p>für thread synchronisation ist volatile dagegen weitestgehend nutzlos</p>
</blockquote>
<p>richtig. ist aber auch nicht das, was ich gesagt hab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>ich weiss. deshalb hab ich auch nicht widersprochen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> - nur unkommentiert lassen wollte ich es auch nicht. volatile und threads ist ein thema, bei dem häufig konfusion herrscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016381</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:37:02 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Tue, 14 Mar 2006 21:38:39 GMT]]></title><description><![CDATA[<p>Weiß nicht, ob's schon gesagt wurde, hab's auf die Schnelle nicht gesehen:</p>
<p>volatile sorgt auch dafür, daß die Variable immer im Speicher nachgelesen wird. Der Compiler darf nicht beschließen die in ein Register zu packen.</p>
<p>while(!workDone);</p>
<p>Mit volatile könnte ein anderer Thread workDone auf true setzen und die Schleife bricht dann ab. Ohne volatile könnte der Compiler beschließen die Variable hier ins Register zu legen. Da ändert sie sich dann allerdings nie.</p>
<p>Man kann damit also schon sowas wie Synchronisation machen. Es ist allerdings recht knifflig das richtig hinzukriegen. Deutlich besser funktioniert es halt doch mit atomaren Operationen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016383</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Tue, 14 Mar 2006 21:38:39 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Wed, 15 Mar 2006 01:34:43 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Weiß nicht, ob's schon gesagt wurde, hab's auf die Schnelle nicht gesehen:</p>
<p>volatile sorgt auch dafür, daß die Variable immer im Speicher nachgelesen wird. Der Compiler darf nicht beschließen die in ein Register zu packen.</p>
<p>while(!workDone);</p>
<p>Mit volatile könnte ein anderer Thread workDone auf true setzen und die Schleife bricht dann ab. Ohne volatile könnte der Compiler beschließen die Variable hier ins Register zu legen. Da ändert sie sich dann allerdings nie.</p>
<p>Man kann damit also schon sowas wie Synchronisation machen. Es ist allerdings recht knifflig das richtig hinzukriegen. Deutlich besser funktioniert es halt doch mit atomaren Operationen.</p>
</blockquote>
<p>missverständlich. Im Register wird die Variable natürlich geändert, aber wahrscheinlich nicht an ihrer Adresse im Hauptspeicher. Die Frage ist, ob bei einem Non-Pointer nicht direkt aus dem Register gelesen wird wenn jene darin liegt, sondern trotzdem aus dem Speicher. Wie ist das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016425</guid><dc:creator><![CDATA[WhoTheFuck???]]></dc:creator><pubDate>Wed, 15 Mar 2006 01:34:43 GMT</pubDate></item><item><title><![CDATA[Reply to Was bewirkt das Schlüsselwot &amp;quot;volatile&amp;quot;? on Wed, 15 Mar 2006 08:24:43 GMT]]></title><description><![CDATA[<p>WhoTheFuck??? schrieb:</p>
<blockquote>
<p>missverständlich. Im Register wird die Variable natürlich geändert, aber wahrscheinlich nicht an ihrer Adresse im Hauptspeicher.</p>
</blockquote>
<p>Wo wird in der Zeile die Variable geändert? Garnicht. Sie ändert sich nicht. Daß ein anderer Thread die Speicherstelle der Variablen verändert bleibt unbemerkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1016478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1016478</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 15 Mar 2006 08:24:43 GMT</pubDate></item></channel></rss>