<?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[Muss der Vektor in diesem Fall durch ein Mutex geschützt werden?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Gegeben ist ein globaler vector&lt;&gt;. Mehrere Threads greifen auf unterschiedliche Indizes dieses vector&lt;&gt;s &quot;gleichzeitig&quot; schreibend zu. Wenn garantiert ist, dass das pro Thread auf unterschiedliche Indizes passiert - müssen dann die Zugriffe durch ein Mutex geschützt werden?</p>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299085/muss-der-vektor-in-diesem-fall-durch-ein-mutex-geschützt-werden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 12:44:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299085.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Feb 2012 10:04:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 10:04:41 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Gegeben ist ein globaler vector&lt;&gt;. Mehrere Threads greifen auf unterschiedliche Indizes dieses vector&lt;&gt;s &quot;gleichzeitig&quot; schreibend zu. Wenn garantiert ist, dass das pro Thread auf unterschiedliche Indizes passiert - müssen dann die Zugriffe durch ein Mutex geschützt werden?</p>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175945</guid><dc:creator><![CDATA[curry-king]]></dc:creator><pubDate>Thu, 02 Feb 2012 10:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 10:07:24 GMT]]></title><description><![CDATA[<p>Muss ein blankes C-Array geschuetzt werden, wenn nur ueber unterschiedliche Indizes auf die Objekte zugegriffen wird?</p>
<p>Btw. Selber denken, Glueck verschenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175946</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 02 Feb 2012 10:07:24 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 10:16:47 GMT]]></title><description><![CDATA[<p>Na eigentlich nicht, da nie zwei threads eine Schreiboperation auf die gleiche Speicherstelle gleichzeitig durchführen. Aber vielleicht gibt es ja höhere Mechanismen (Speicherverwaltung...), die dem widersprechen !?</p>
<p>Edit: Oder gibt es die nicht ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175948</guid><dc:creator><![CDATA[curry-king]]></dc:creator><pubDate>Thu, 02 Feb 2012 10:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 10:27:02 GMT]]></title><description><![CDATA[<p>Wenn kein Thread auf die Idee kommt, dem Vector ein neues Element hinzuzufügen,<br />
was eine Reallokation zur Folge haben kann, dann eigentlich nicht.<br />
Intern verhält sich der Vektor wie ein Array und ein Array ist im Grunde nichts anderes als eine Reihe von unabhängigen Objekten, die eben hintereinander im Speicher liegen. Wenn immer nur ein Thread auf eines dieser Objekte zugreift, passiert da gar nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175952</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Thu, 02 Feb 2012 10:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 10:28:20 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn [...] müssen dann die Zugriffe durch ein Mutex geschützt werden?</p>
</blockquote>
<p>Ich hoffe nicht. Denn dann hätte ich auf der Arbeit Mist gebaut. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2175953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175953</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 02 Feb 2012 10:28:20 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 10:32:20 GMT]]></title><description><![CDATA[<p>Dann hab ich wohl auch Glück gehabt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175955</guid><dc:creator><![CDATA[curry-king]]></dc:creator><pubDate>Thu, 02 Feb 2012 10:32:20 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 10:45:55 GMT]]></title><description><![CDATA[<p>Man könnte auch einen Zeiger auf das erste Element irgendwo ablegen, und die Elemente dann über diesen ansprechen.<br />
Damit ist vector&lt;&gt; aus dem Spiel - die einzige Anforderung ist dann dass nicht zwei Elemente von unterschiedlichen Threads verwendet werden, und dass keiner eine Reallocation vom vector&lt;&gt; auslöst.</p>
<p>Ansonsten müsste man mal sehen wie der non-const operator [] definiert ist. Wenn der als Leseoperation definiert ist, dann müsste der Standard auch mit direktem Zugriff garantieren dass es funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175961</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 02 Feb 2012 10:45:55 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 11:03:05 GMT]]></title><description><![CDATA[<p>Also bei Java ist es zumindest so, dass wenn mindestens 1 thread auf etwas schreibt und es zusätzlich noch andere leser gibt, synchronisiert werden muss (volatile oder lock).</p>
<p>Ich weiß nicht genau, ob das bei c++ auch so ist.</p>
<p>Der Grund ist wohl, dass es beim schreiben sein kann, dass erstmal nur in den cache geschrieben wird oder vielleicht auch erstmal nur in ein register und das geschriebene deswegen für andere unter umständen noch nicht sichtbar ist.</p>
<p>Korrigiert mich bitte, falls das falsch ist. Aber bei &quot;Java Concurrency in Practie&quot; wurde das so gelehrt, wenn ich das nicht ganz falsch verstanden habe.<br />
Und dieses Problem sollte ja eigentlich Sprachunabhängig vorhanden sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175965</guid><dc:creator><![CDATA[*Q* 1]]></dc:creator><pubDate>Thu, 02 Feb 2012 11:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 11:13:08 GMT]]></title><description><![CDATA[<p>Q schrieb:</p>
<blockquote>
<p>Also bei Java ist es zumindest so, dass wenn mindestens 1 thread auf etwas schreibt und es zusätzlich noch andere leser gibt, synchronisiert werden muss (volatile oder lock).</p>
<p>Ich weiß nicht genau, ob das bei c++ auch so ist.</p>
</blockquote>
<p>Das ist richtig, aber hier nicht gefragt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175967</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 02 Feb 2012 11:13:08 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 11:21:09 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<blockquote>
<p>Wenn [...] müssen dann die Zugriffe durch ein Mutex geschützt werden?</p>
</blockquote>
<p>Ich hoffe nicht. Denn dann hätte ich auf der Arbeit Mist gebaut. <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>Dann hast du Mist gebaut. Da je nach Prozessor möglicherweise mehr Bits geschrieben werden, als du eigentlich verändert hast (z.B. änderst du ein Bool, der Prozessor schreibt aber 64 Bit), können benachbarte Werte überschrieben werden. Das hängt vermutlich auch vom Compiler ab, da C++ ja erst im neusten Standard Threads kennt.<br />
Herb Sutter hatte das mal in einem seiner Thread Artikel für Dr. Dobb's beschrieben (leider kann ich spontan keinen Link liefern). In &quot;Programming with POSIX Threads&quot; von Butenhof werden die Probleme ebenfalls erläutert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175971</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 02 Feb 2012 11:21:09 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 13:12:36 GMT]]></title><description><![CDATA[<p>manni66, das, was Du meinst, nennt sich &quot;false sharing&quot;. Da geht es im Wesentlichen um ein ungeschicktes Speicherlayout und/oder einer ungeschickten Arbeitsaufteilung, die sich Cache-bedingt typischerweise negativ in der Ausführungsgeschwindigkeit auswirkt. Bis auf Unterschiede in der Ausführungsgeschwindigkeit ist der Cache aber transparent und es macht für die Korrektheit keinen Unterschied, wie groß eine Cache-Line ist. Die Geschwindigkeitseinbußen kommen gerade daher, dass die Caches sich wegen false sharing aufwendig synchronisieren müssen (per <a href="http://de.wikipedia.org/wiki/Cache-Koh%C3%A4renz" rel="nofollow">Cache-Kohärenz-Protokoll</a>). Das wär ja sonst ein ziemlich blödes Speichermodell. Ich bin mir ziemlich sicher, dass im C++2011 Speichermodell der gleichzeitige Zugriff auf benachbarte Bytes (also thread 1 -&gt; byte 1, thread 2 -&gt; byte 2) kein Datenrennen darstellt.</p>
<p>Da ich in meinem Fall jedem Thread einen kontinuierlichen Bereich des Vektors zuordne, kann es höchstens an den Intervallgrenzen zu false sharing kommen. Und selbst da ist es unwahrscheinlich, weil jeder Thread linear forwärts durch sein eigenes Intervall des Vektors läuft.</p>
<p>Ich bin jetzt kein multi-CPU-/Cache-Profi, der auf unterster Ebene weiß, was genau passiert. Das muss man aber auch nicht sein, um korrekt programmieren zu können. Da reichen Speichermodelle. Die Caches sich im Fall von false sharing unterhalten, ist mir echt egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2175980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2175980</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 02 Feb 2012 13:12:36 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 15:00:24 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>:<br />
&quot;False sharing&quot; nennt man das wenn es die Performance drückt, aber alles korrekt funktioniert.<br />
Wenn es zu unerwünschtem/unerwartetem Verhalten führt, dann nennt man es Scheissendreck. (Ne, sorry, keine Ahnung wie man dann sagt :D)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176049</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 02 Feb 2012 15:00:24 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 15:06:05 GMT]]></title><description><![CDATA[<p>Herb Sutter redet ganz gerne von &quot;false sharing&quot; in diesem Kontext. Ich denke, das ist es, was manni66 im Gedächtnis hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176052</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 02 Feb 2012 15:06:05 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 15:15:58 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Herb Sutter redet ganz gerne von &quot;false sharing&quot; in diesem Kontext. Ich denke, das ist es, was manni66 im Gedächtnis hatte.</p>
</blockquote>
<p>Nein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176057</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 02 Feb 2012 15:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 15:40:24 GMT]]></title><description><![CDATA[<p>Sorry, es sieht für mich immer noch so aus, als ob Du das mit dem Chache falsch verstanden hast. Da hat das &quot;Nein&quot; nichts dran geändert, fürchte ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176064</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 02 Feb 2012 15:40:24 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 17:16:56 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Sorry, es sieht für mich immer noch so aus, als ob Du das mit dem Chache falsch verstanden hast. Da hat das &quot;Nein&quot; nichts dran geändert, fürchte ich.</p>
</blockquote>
<p>Naja, mindestens einer von uns liegt falsch <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2176110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176110</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 02 Feb 2012 17:16:56 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 19:04:02 GMT]]></title><description><![CDATA[<p>BTW: Das Speichermodell von C++0x erlaubt diesbezüglich soweit ich weiss kein unerwartetes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176148</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 02 Feb 2012 19:04:02 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 19:57:50 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>BTW: Das Speichermodell von C++0x erlaubt diesbezüglich soweit ich weiss kein unerwartetes Verhalten.</p>
</blockquote>
<p>IMHO muss man dann aber std::atomic&lt;&gt; (oder so ähnlich) verwenden. Ob man dann bei einem Array aber die Elemente auch als atomic definieren muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176168</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 02 Feb 2012 19:57:50 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 20:20:53 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>BTW: Das Speichermodell von C++0x erlaubt diesbezüglich soweit ich weiss kein unerwartetes Verhalten.</p>
</blockquote>
<p>IMHO muss man dann aber std::atomic&lt;&gt; (oder so ähnlich) verwenden. Ob man dann bei einem Array aber die Elemente auch als atomic definieren muss?</p>
</blockquote>
<p>Nein.<br />
Lass es sein, bitte, und hoer auf krümelkacker.</p>
<p>atomic ist wieder was ganz anderes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176173</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 02 Feb 2012 20:20:53 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Thu, 02 Feb 2012 21:33:23 GMT]]></title><description><![CDATA[<p>1.7/3</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2176218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176218</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 02 Feb 2012 21:33:23 GMT</pubDate></item><item><title><![CDATA[Reply to Muss der Vektor in diesem Fall durch ein Mutex geschützt werden? on Fri, 03 Feb 2012 15:29:53 GMT]]></title><description><![CDATA[<p>vector&lt;bool&gt; kann zu Data Races führen, aber der ist bekanntlich ein Sonderfall.</p>
<blockquote>
<p>23.2.2 Container data races<br />
...<br />
2 Notwithstanding (17.6.5.9), implementations are required to avoid data races when the contents of the contained<br />
object in different elements in the same sequence, excepting vector&lt;bool&gt;, are modified concurrently.</p>
<p>3 [ Note: For a vector&lt;int&gt; x with a size greater than one, x[1] = 5 and *x.begin() = 10 can be executed<br />
concurrently without a data race, but x[0] = 5 and *x.begin() = 10 executed concurrently may result in<br />
a data race. As an exception to the general rule, for a vector&lt;bool&gt; y, y[0] = true may race with y[1]= true. —end note ]</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2176480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2176480</guid><dc:creator><![CDATA[einwurf]]></dc:creator><pubDate>Fri, 03 Feb 2012 15:29:53 GMT</pubDate></item></channel></rss>