<?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[Thread safety map::operator[]]]></title><description><![CDATA[<p>Zuerst mal ich weiß, dass der Standard kein Wort darüber verliert. Trotzdem kann das Thema nicht völlig ignoriert werden, allerdings verschließt das Standardisierungskomitee vermutlich noch eine Zeit lang die Augen davor. Es bleibt also bei dem, was die Implementierungen bereitstellen. Natürlich muss man das im Einzelfall immer nachlesen.</p>
<p>Es geht mir jetzt einfach um die Erwartung, die man zur Threadsicherheit der STL vernünftigerweise haben kann, speziell beim gleichzeitigen Lesen aus mehreren Threads. Beispielsweise halte ich es für vernünftig, anzunehmen, dass der gleichzeitige Lesezugriff von mehreren Threads auf einen vector nichts kaputt macht. Man kann sich ja ungefähr vorstellen, wie etwas implementiert wird und entsprechend ableiten, ob ein gleichzeitiger Lesezugriff möglich ist.</p>
<p>Wie sieht es mit solchen Überlegungen beim operator[] der map aus? Wenn ein Eintrag mit dem Key nicht existiert, wird er ja angelegt, was die interne Struktur der map verändern kann. Ist es sinnvoll anzunehmen, dass aus einer map nicht mehrere Threads gleichzeitig lesen können? Könnte der const Value&amp; operator[] const so implementiert werden, dass er an der map nichts verändert, da er ohnehin eine const Referenz zurückgibt (map hält irgendwo den Standardwert vorrätig)?</p>
<p>Oder ist es möglicherweise sicher, den operator[] anzuwenden, wenn man vorher auf Existenz des Keys prüft? Wildes Raten herzlich willkommen. <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="🙂"
    /> Bevor die ersten Leute ausflippen, ich habe momentan keinen konkreten Anwendungsfall, es ist mir also egal, wie verlässlich die Aussagen sind - ich sammle nur Ideen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218528/thread-safety-map-operator</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 03:03:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218528.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Jul 2008 22:54:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Thread safety map::operator[] on Mon, 21 Jul 2008 22:54:07 GMT]]></title><description><![CDATA[<p>Zuerst mal ich weiß, dass der Standard kein Wort darüber verliert. Trotzdem kann das Thema nicht völlig ignoriert werden, allerdings verschließt das Standardisierungskomitee vermutlich noch eine Zeit lang die Augen davor. Es bleibt also bei dem, was die Implementierungen bereitstellen. Natürlich muss man das im Einzelfall immer nachlesen.</p>
<p>Es geht mir jetzt einfach um die Erwartung, die man zur Threadsicherheit der STL vernünftigerweise haben kann, speziell beim gleichzeitigen Lesen aus mehreren Threads. Beispielsweise halte ich es für vernünftig, anzunehmen, dass der gleichzeitige Lesezugriff von mehreren Threads auf einen vector nichts kaputt macht. Man kann sich ja ungefähr vorstellen, wie etwas implementiert wird und entsprechend ableiten, ob ein gleichzeitiger Lesezugriff möglich ist.</p>
<p>Wie sieht es mit solchen Überlegungen beim operator[] der map aus? Wenn ein Eintrag mit dem Key nicht existiert, wird er ja angelegt, was die interne Struktur der map verändern kann. Ist es sinnvoll anzunehmen, dass aus einer map nicht mehrere Threads gleichzeitig lesen können? Könnte der const Value&amp; operator[] const so implementiert werden, dass er an der map nichts verändert, da er ohnehin eine const Referenz zurückgibt (map hält irgendwo den Standardwert vorrätig)?</p>
<p>Oder ist es möglicherweise sicher, den operator[] anzuwenden, wenn man vorher auf Existenz des Keys prüft? Wildes Raten herzlich willkommen. <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="🙂"
    /> Bevor die ersten Leute ausflippen, ich habe momentan keinen konkreten Anwendungsfall, es ist mir also egal, wie verlässlich die Aussagen sind - ich sammle nur Ideen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551277</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 21 Jul 2008 22:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to Thread safety map::operator[] on Mon, 21 Jul 2008 23:49:45 GMT]]></title><description><![CDATA[<p>Wenn es nur ums lesen geht, wieso verwendest du dann bei der Map nicht einfach die Funktion <a href="http://www.cplusplus.com/reference/stl/map/find.html" rel="nofollow">find</a>?<br />
Das sollte wohl beim reinen Lesezugriff kein Problem darstellen, da die Funktion den End-Iterator zurück gibt, falls das Objekt nicht gefunden wurde.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551294</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 21 Jul 2008 23:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to Thread safety map::operator[] on Tue, 22 Jul 2008 02:12:34 GMT]]></title><description><![CDATA[<p>Bei den meisten STL Implementierungen die überhaupt nur irgendwie threadsafe sind kannst du davon ausgehen dass wenn wo &quot;const&quot; hinten dran steht dürfen mehrere Threads es gleichzeitig machen (auf das selbe Objekt), und wenn nicht &quot;const&quot; dransteht dann nicht (und dann darf natürlich auch kein anderer Thread gleichzeitig etwas &quot;mit const&quot; machen). Üblicherweise nennt man das Aufrufen von &quot;const&quot; Methoden dann auch &quot;lesen&quot; (read), und das Aufrufen von &quot;nicht const&quot; Funktionen &quot;schreiben&quot; (write).</p>
<p>Und statische Funktionen (sowie freie Funktionen und Funktions-Templates) haben auch gefälligst threadsafe zu sein.</p>
<p>Das beantwortet auch deine Frage nach dem operator []: nope, da er nicht const ist. Mir ist klar dass es durchaus Implementierungen geben könnte wo das problemlos funktioniert solange der Key für [] immer schon existiert, bloss garantieren wird es dir wohle keine Implementierung.</p>
<p>Verwende einfach find und gut is.</p>
<blockquote>
<p>Ist es sinnvoll anzunehmen, dass aus einer map nicht mehrere Threads gleichzeitig lesen können?</p>
</blockquote>
<p>Nein, normalerweise geht das, bloss nicht über [] sondern über find wie Dravere<br />
schon vorgeschlagen hat.</p>
<blockquote>
<p>Könnte der const Value&amp; operator[] const so implementiert werden, dass er an der map nichts verändert, da er ohnehin eine const Referenz zurückgibt (map hält irgendwo den Standardwert vorrätig)?</p>
</blockquote>
<p>Wer behauptet denn dass es diesen Operator gibt? Ich behaupte es gibt ihn nicht (darf es auch garnicht). -&gt; find.</p>
<blockquote>
<p>Oder ist es möglicherweise sicher, den operator[] anzuwenden, wenn man vorher auf Existenz des Keys prüft?</p>
</blockquote>
<p>Und nochmal: verwende find.</p>
<blockquote>
<p>Wildes Raten herzlich willkommen.</p>
</blockquote>
<p>Also WILD geraten ist von mir hier nichts, und ich würde sogar behaupten ziemlich verlässlich.</p>
<p>BTW:</p>
<p>MSDN schrieb:</p>
<blockquote>
<p><strong>Container Classes and complex</strong></p>
<p>The container classes are vector, deque, list, queue, stack, priority_queue, valarray, map, hash_map, multimap, hash_multimap, set, hash_set, multiset, hash_multiset, basic_string, and bitset.</p>
<p><em>A single object is thread safe for reading from multiple threads. For example, given an object A, it is safe to read A from thread 1 and from thread 2 simultaneously.</em></p>
<p>If a single object is being written to by one thread, then all reads and writes to that object on the same or other threads must be protected. For example, given an object A, if thread 1 is writing to A, then thread 2 must be prevented from reading from or writing to A.</p>
<p>It is safe to read and write to one instance of a type even if another thread is reading or writing to a different instance of the same type. For example, given objects A and B of the same type, it is safe if A is being written in thread 1 and B is being read in thread 2.</p>
<p><strong>iostream Classes</strong><br />
The iostream classes follow the same rules as the container classes, with one exception. It is safe to write to an object from multiple threads. For example, thread 1 can write to cout at the same time as thread 2. However, this can result in the output from the two threads being intermixed.</p>
<p>Note:<br />
Reading from a stream buffer is not considered to be a read operation. It should be considered as a write operation, because this changes the state of the class.</p>
</blockquote>
<p>Und ich bin mir 99% sicher dass die mit &quot;read&quot; und &quot;write&quot; genau das meinen was ich oben beschrieben habe (const vs. non-const).</p>
<p>Andere STL Implementierungen haben durchaus ähnliche Aussagen zu dem Thema, also guck dir einfach mal die Doku zu STLport oder der GNU STL an.</p>
<p>BTW: weiss jmd. wie das mit C++09 aussieht, also ob da endlich auch *verbindliche* Vorschriften was das angeht in den Standard wandern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551306</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 22 Jul 2008 02:12:34 GMT</pubDate></item><item><title><![CDATA[Reply to Thread safety map::operator[] on Tue, 22 Jul 2008 07:43:03 GMT]]></title><description><![CDATA[<p>Ok lol. Ist mir noch gar nicht aufgefallen, dass der op[] nicht überladen ist. Das macht es natürlich einfacher. Du meinst C++0xA? <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/1551396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551396</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 22 Jul 2008 07:43:03 GMT</pubDate></item></channel></rss>