<?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[std::list und MultiThread...]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich weiss das die list eigentlich nicht Threadsafe ist, sprich man muss sie synchronisieren.<br />
Aber wenn ich folgende Situation habe:</p>
<p>Thread A schreibt nur neue Objekte in die std::list (mit push_back())<br />
Thread B liest und löscht immer das erste Objekt (.empty(), front(), pop_front())</p>
<p>Wenn ich noch kontrolliere das die max Grösse der Liste nicht überschritten wird, müsste dies doch eigentlich schon synchron sein...<br />
Oder hab ich da was übersehen?</p>
<p>Vielen Dank und Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264022/std-list-und-multithread</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 04:59:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264022.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 Mar 2010 13:56:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::list und MultiThread... on Wed, 31 Mar 2010 13:56:35 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich weiss das die list eigentlich nicht Threadsafe ist, sprich man muss sie synchronisieren.<br />
Aber wenn ich folgende Situation habe:</p>
<p>Thread A schreibt nur neue Objekte in die std::list (mit push_back())<br />
Thread B liest und löscht immer das erste Objekt (.empty(), front(), pop_front())</p>
<p>Wenn ich noch kontrolliere das die max Grösse der Liste nicht überschritten wird, müsste dies doch eigentlich schon synchron sein...<br />
Oder hab ich da was übersehen?</p>
<p>Vielen Dank und Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875998</guid><dc:creator><![CDATA[Guest_111]]></dc:creator><pubDate>Wed, 31 Mar 2010 13:56:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Wed, 31 Mar 2010 14:13:31 GMT]]></title><description><![CDATA[<p>Da du nicht weißt, wie die Listen intern konzipiert sind, kann man keine Angaben darüber machen, in welchem Umfang die Daten umstrukturiert werden, wenn ein Datensatz gelöscht wird. Wenn du also sauber programmieren willst, dann bleibt dir nichts anderes übrig, als die Operationen korrekt zu synchronisieren.</p>
<p>Insgesamt ist das in C++ aber auch keine große Sache.</p>
<pre><code class="language-cpp">class MutexLocker
{
 private:
  Mutex mutex;

 public:
  MutexLocker()
  { mutex.lock(); }

  ~MutexLocker()
  { mutex.unlock(); }
};
</code></pre>
<p>Verwendung:</p>
<pre><code class="language-cpp">{
   MutexLocker lock;
   // [...]
} // Mutex wird automatisch wieder freigegeben
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1876008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876008</guid><dc:creator><![CDATA[kjljkl]]></dc:creator><pubDate>Wed, 31 Mar 2010 14:13:31 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Wed, 31 Mar 2010 14:17:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ja genau das hoffte ich eigentlich in Erfahrung zu kriegen...</p>
<p>Meine Anwendung:<br />
Thread A empfängt Packete auf einem Socket<br />
Thread B holt diese immer ab</p>
<p>Wenn ich das ganze synchronisieren muss, müsste ich eben noch die Liste immer kopieren und das hoffte ich zu umgehen <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>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876011</guid><dc:creator><![CDATA[Guest_111]]></dc:creator><pubDate>Wed, 31 Mar 2010 14:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Wed, 31 Mar 2010 14:25:52 GMT]]></title><description><![CDATA[<p>Du kannst doch einfach eine eigene Klasse um die std::list basteln.</p>
<pre><code class="language-cpp">class MyList
{
 private:
  std::list&lt;...&gt; list;

 public:
  void add(x)
  {
   MutexLocker lock;
   list.push(x);
  }

  void remove(x)
  {
   MutexLocker lock;
   list.erase(x);
  }
};
</code></pre>
<p>Ich bin mir nur nicht sicher, ob man diese Klasse als Referenz an andere Threads übergeben kann. Aber eigentlich müsste das so gehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876017</guid><dc:creator><![CDATA[klöklö]]></dc:creator><pubDate>Wed, 31 Mar 2010 14:25:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Wed, 31 Mar 2010 14:25:55 GMT]]></title><description><![CDATA[<p>Guest_111 schrieb:</p>
<blockquote>
<p>Oder hab ich da was übersehen?</p>
</blockquote>
<p>Ja. push_back erzeugt nicht nur einen neuen Listenknoten, sondern verändert auch den letzten Listenknoten (falls vorhanden), nämlich dessen next-Pointer.<br />
pop_front löscht nicht nur den ersten Listenknoten sondern modifiziert auch noch den zweiten (der zum ersten wird, falls vorhanden), nämlich dessen prev-Pointer.</p>
<p>Wenn bei einer Liste mit zwei Elementen gleichzeitig push_back und pop_front ausführst, wird also gleichzeitig das zweite Element bearbeitet, wenngleich es unterschiedliche Member des Knotens sind. Klingt irgendwie trotzdem potentiell ungesund.<br />
Wenn du bei einer Liste mit nur einem Element gleichzeitig push_back und pop_front machst gibts Chaos: der neu hinten angefügte Listenknoten könnte einen prev-Pointer erhalten, der auf den im selben Moment gelöschten Knoten zeigt, also ins Nirvana.</p>
<p>Dazu kommt das Problem mit der Größe: std::list wird vermutlich ihre Größe in einer Variablen speichern. Beide Methoden werden die gleichzeitig inkrementieren und dekrementieren, ein klassischer Lehrbuchfall für eine Race Condition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876018</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 31 Mar 2010 14:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Wed, 31 Mar 2010 17:01:46 GMT]]></title><description><![CDATA[<p>Danke euch für die schnellen Antworten,</p>
<p>wie ich sehe hab ich etwas viel übersehen <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="😉"
    /> Aber dafür gibts ja solche Foren...</p>
<p>Komm wohl über das Kopieren der List nicht drumherum.</p>
<p>Vielen Dank und viel spass noch beim coden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876082</guid><dc:creator><![CDATA[Guest_111]]></dc:creator><pubDate>Wed, 31 Mar 2010 17:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Wed, 31 Mar 2010 17:21:10 GMT]]></title><description><![CDATA[<p>Passend dazu folgener Artikel: <a href="http://www.drdobbs.com/high-performance-computing/210604448" rel="nofollow">Writing Lock-Free Code: A Corrected Queue</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876096</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 31 Mar 2010 17:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Wed, 31 Mar 2010 22:47:34 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn ich noch kontrolliere das die max Grösse der Liste nicht überschritten wird, müsste dies doch eigentlich schon synchron sein...</p>
</blockquote>
<p>Nein.</p>
<blockquote>
<p>Oder hab ich da was übersehen?</p>
</blockquote>
<p>Übersehen ist nicht das richtige Wort. Die fehlen nur die Grundlagen um überhaupt beurteilen zu können ob etwas threadsafe ist.</p>
<p>Davon abgesehen gilt: ob eine Library-Funktion threadsafe ist, und was mit threadsafe gemeint ist, findest du in der Doku. Wenn diesbezüglich nix drinnen steht, musst du davon ausgehen, dass sie nicht threadsafe ist. Da im C++ Standard diesbezüglich nix steht... -&gt; nichts ist threadsafe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876211</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 31 Mar 2010 22:47:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Thu, 01 Apr 2010 06:55:19 GMT]]></title><description><![CDATA[<p>Guest_111 schrieb:</p>
<blockquote>
<p>Komm wohl über das Kopieren der List nicht drumherum.</p>
</blockquote>
<p>Warum solltest du die Liste kopieren müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876248</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Thu, 01 Apr 2010 06:55:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Thu, 01 Apr 2010 11:57:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a><br />
Hab ja im ersten Satz von diesem Artikel geschrieben das sie nicht ThreadSafe ist...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20104">@l</a>'abra d'or<br />
Meine Applikation:<br />
Thread A empfängt Packete auf einem Socket<br />
Thread B holt diese immer ab</p>
<p>Wenn nun ununterbrochen auf dem Socket geschrieben wird, wird der Mutex ja praktisch nie freigegeben... So muss ich das Zeugs kopieren um eine Art &quot;neutrale Liste&quot; zu erhalten...<br />
--&gt; Thread A empfängt speichert in Liste A, Kopiert Liste A in B<br />
--&gt; Thread B holt Daten von Liste B</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876350</guid><dc:creator><![CDATA[Guest_111]]></dc:creator><pubDate>Thu, 01 Apr 2010 11:57:00 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Thu, 01 Apr 2010 12:06:01 GMT]]></title><description><![CDATA[<p>Guest_111 schrieb:</p>
<blockquote>
<p>Wenn nun ununterbrochen auf dem Socket geschrieben wird, wird der Mutex ja praktisch nie freigegeben... So muss ich das Zeugs kopieren um eine Art &quot;neutrale Liste&quot; zu erhalten...<br />
--&gt; Thread A empfängt speichert in Liste A, Kopiert Liste A in B<br />
--&gt; Thread B holt Daten von Liste B</p>
</blockquote>
<p>Komiker...<br />
Das umkopieren musst du ja auch mit ner Mutex absichern, sonst stehst du vor dem selben Problem, dass während dem Umkopieren die Liesten manipuliert weden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876353</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Thu, 01 Apr 2010 12:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Thu, 01 Apr 2010 20:35:03 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Guest_111 schrieb:</p>
<blockquote>
<p>Oder hab ich da was übersehen?</p>
</blockquote>
<p>Ja. push_back erzeugt nicht nur einen neuen Listenknoten, sondern verändert auch den letzten Listenknoten (falls vorhanden), nämlich dessen next-Pointer.<br />
pop_front löscht nicht nur den ersten Listenknoten sondern modifiziert auch noch den zweiten (der zum ersten wird, falls vorhanden), nämlich dessen prev-Pointer.</p>
<p>Wenn bei einer Liste mit zwei Elementen gleichzeitig push_back und pop_front ausführst, wird also gleichzeitig das zweite Element bearbeitet, wenngleich es unterschiedliche Member des Knotens sind. Klingt irgendwie trotzdem potentiell ungesund.<br />
Wenn du bei einer Liste mit nur einem Element gleichzeitig push_back und pop_front machst gibts Chaos: der neu hinten angefügte Listenknoten könnte einen prev-Pointer erhalten, der auf den im selben Moment gelöschten Knoten zeigt, also ins Nirvana.</p>
<p>Dazu kommt das Problem mit der Größe: std::list wird vermutlich ihre Größe in einer Variablen speichern. Beide Methoden werden die gleichzeitig inkrementieren und dekrementieren, ein klassischer Lehrbuchfall für eine Race Condition.</p>
</blockquote>
<p>Der Punkt ist einfach: es macht kaum Sinn, sich über sowas Gedanken zu machen, wenn es nicht garantiert wird. Und das wird es nicht. Das ist auch das was ich mit meinem Beitrag zum Ausdruck bringen wollte.</p>
<p>Nur weil man sich z.B. vorstellen würde man könnte oder sollte eine std::list so-oder-so implementieren, und dass bei einer solchen Implementierung dieses oder jenes &quot;automatisch&quot; thread-safe wäre, kann man sich noch lange nicht darauf verlassen, dass es das auch wirklich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876606</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 01 Apr 2010 20:35:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Thu, 01 Apr 2010 22:01:46 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nur weil man sich z.B. vorstellen würde man könnte oder sollte eine std::list so-oder-so implementieren, und dass bei einer solchen Implementierung dieses oder jenes &quot;automatisch&quot; thread-safe wäre, kann man sich noch lange nicht darauf verlassen, dass es das auch wirklich ist.</p>
</blockquote>
<p>Meine Argumentation war auch exakt gegenteilig. Weil diverse Implementierungen erlaubt und möglich sind, die <strong>nicht</strong> threadsafe sind, ist std::list auch <strong>nicht</strong> garantiert threadsafe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876647</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 01 Apr 2010 22:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::list und MultiThread... on Fri, 02 Apr 2010 00:45:09 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Nur weil man sich z.B. vorstellen würde man könnte oder sollte eine std::list so-oder-so implementieren, und dass bei einer solchen Implementierung dieses oder jenes &quot;automatisch&quot; thread-safe wäre, kann man sich noch lange nicht darauf verlassen, dass es das auch wirklich ist.</p>
</blockquote>
<p>Meine Argumentation war auch exakt gegenteilig. Weil diverse Implementierungen erlaubt und möglich sind, die <strong>nicht</strong> threadsafe sind, ist std::list auch <strong>nicht</strong> garantiert threadsafe.</p>
</blockquote>
<p>Ist mir schon klar.<br />
Ich finde nur die Art wie du es dargelegt hast ... potentiell irreführend.</p>
<p>Im Leser könnte die Idee aufkommen, man müsse sich nur durchdenken wie etwas implementiert sein könnte, und könne daraus schliessen ob es nicht vielleicht auch ohne externe Synchronisierung Thread-Safe sein könnte.</p>
<p>Und IMO ist das der falsche Ansatz. Es ist für jede Funktion jeder Klasse möglich, eine standardkonforme Implementierung zu schreiben, die nicht Thread-Safe ist. Ganz egal wie einfach die Funktion vielleicht ist.</p>
<p>Daher ist IMO der einzig sinnvolle Ansatz: &quot;gucken was draufsteht&quot;, und sich danach richten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1876681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1876681</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 02 Apr 2010 00:45:09 GMT</pubDate></item></channel></rss>